System.TypeLoadException, когда я пытаюсь преобразовать JArray в объект в потоке

У меня есть код C#, который преобразует объект JArray jsonArray (JSON.Net) в список объектов jsonList (List‹ MyClass >):

List<MyClass> jsonList = jsonArray.ToObject<List<MyClass>> ();

Приведенный выше код отлично работает, когда я запускаю его в основном потоке, но если я помещу тот же код в другой поток, например так:

Thread t = new Thread(delegate() {
    List<MyClass> jsonList = jsonArray.ToObject<List<MyClass>> ();
});
t.Start();

Я получаю следующее сообщение об ошибке: «Было выброшено исключение System.TypeLoadException. Произошло исключение загрузки типа».

Кто-нибудь знает, почему это происходит? Полная трассировка стека приведена ниже. Заранее спасибо!

System.TypeLoadException: произошло исключение загрузки типа. в Newtonsoft.Json.Utilities.ThreadSafeStore2[System.Type,System.Type].AddValue (System.Type key) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Utilities.ThreadSafeStore2[System.Type,System.Type].Get (ключ System.Type) [0x00000] в: 0 в Newtonsoft.Json.Serialization.JsonTypeReflector.GetAssociatedMetadataType (тип System.Type) [0x00000] в: 0 в Newtonsoft.Json.Serialization.JsonTypeReflector.GetAttribute[JsonContainerAttribute] (тип System.Type) [0x00000] в: 0 в Newtonsoft.Json.Serialization.JsonTypeReflector.GetAttribute[JsonContainerAttribute] (ICustomAttributeProvider attributeProvider) [0x00000] в: 0 в Newtonsoft.Json.Utilities.ThreadSafeStore2[System.Reflection.ICustomAttributeProvider,Newtonsoft.Json.JsonContainerAttribute].AddValue (ICustomAttributeProvider key) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Utilities.ThreadSafeStore2[System.Reflection.ICustomAttributeProvider,Newtonsoft.Json.JsonContainerAttribute].Get (ключ ICustomAttributeProvider) [0x00000] в: 0 в Newtonsoft.Json.Serialization.CachedAttributeGetter1[Newtonsoft.Json.JsonContainerAttribute].GetAttribute (ICustomAttributeProvider type) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Serialization.JsonTypeReflector.GetJsonContainerAttribute (System.Type type) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Serialization.JsonTypeReflector.GetJsonObjectAttribute (System.Type type) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract (System.Type objectType) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract (System.Type type) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.GetContractSafe (System.Type type) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType, Boolean checkAdditionalContent) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.JsonSerializer.DeserializeInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.JsonSerializer.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Linq.JToken.ToObject (System.Type objectType, Newtonsoft.Json.JsonSerializer jsonSerializer) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Linq.JToken.ToObject (System.Type objectType, Boolean isNullable) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Linq.JToken.ToObject (System.Type objectType) [0x00000] in <filename unknown>:0 at Newtonsoft.Json.Linq.JToken.ToObject[List1] () [0x00000] в: 0 в GuiaTV.AgoraController.GetJSON () [0x00015] в /Users/vegidio/Documents/Dev/Xamarin/GuiaTV/GuiaTV/Controllers/AgoraController.cs:24 в GuiaTV.AgoraScreen.m__2 () [0x0000d] в /Users/ vegidio/Документы /Dev/Xamarin/GuiaTV/GuiaTV/Views/AgoraScreen.cs:43 в System.Threading.Thread.StartInternal () [0x0001d] в /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Threading/Thread .cs:697


person vegidio    schedule 24.02.2013    source источник
comment
Ваша проблема может быть связана с этим вопросом: stackoverflow.com/ вопросы/10112533/   -  person Mike Zboray    schedule 24.02.2013
comment
Большое спасибо, это помогло. По-видимому, существует определенная версия JSON.Net, которая работает с MonoTouch.   -  person vegidio    schedule 24.02.2013


Ответы (2)



Если вы установите точку останова на

List<MyClass> jsonList = jsonArray.ToObject<List<MyClass>> ();

и наведите указатель мыши на эту точку останова, чтобы посмотреть на внутреннее исключение, что оно говорит?

Причина, по которой я спрашиваю, заключается в том, что исключение TypeLoad либо выдаст нулевое значение, либо даст вам сообщение о внутреннем исключении, которое может помочь вам немного больше, чем эта трассировка стека.

person Sipps    schedule 24.02.2013