Я пишу приложение на универсальной платформе Windows (Win10). И возникла проблема с использованием пользовательского конвертера Json при работе в режиме выпуска, что означает компиляцию через .NET Native. Вот мой код конвертера
public class NestedObjectJsonConverter : JsonConverter
{
private string childNodeName;
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType != JsonToken.StartObject)
{
return serializer.Deserialize(reader, objectType);
}
var rootObject = JObject.Load(reader);
var childToken = rootObject[childNodeName];
return ServiceModelJsonConvert.DeserializeObject(childToken, objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName(childNodeName);
writer.WriteRawValue(JsonConvert.SerializeObject(value));
writer.WriteEndObject();
}
public NestedObjectJsonConverter(string childNodeName)
{
this.childNodeName = childNodeName;
}
}
при срабатывании этого преобразователя в режиме выпуска. он получает исключение «ошибка создания», но отлично работает в режиме отладки.
Я зарегистрировал свое сообщение об исключении
HResult: -2146233088 Имя типа: Newtonsoft.Json.JsonException, Newtonsoft.Json, версия = 8.0.0.0, культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed Сообщение: Newtonsoft.Json.JsonException: ошибка создания «NestedObjectJsonConverter». ---> System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. в Newtonsoft.Json.Serialization.JsonTypeReflector. ‹> c.b__18_1 (Параметр объекта) в System.Func.Invoke (Runtime.CompilerServices.CallSiteBinder arg) в SharedLibrary! + 0x3a908c в SharedLibrary! + 0x3b1492a в SharedLibrary! + 0x3b1492a в SharedLibrary! Json.Serialization.JsonTypeReflector. ‹> C__DisplayClass18_0.b__0 (Параметры Object []) --- Конец трассировки стека внутреннего исключения --- в Newtonsoft.Json.Serialization.JsonTypeReflector.‹> C__DisplayClass18_0.b__0 (Параметры Object []) в System.Func.Invoke (аргумент Runtime.CompilerServices.CallSiteBinder) в Newtonsoft.Json.Serialization.JsonTypeReflector.GetJsonConverter (Object attributeProvider) в Newtonsoft.Json.Serialization.DefaultContractResolver.SetPropertySettingsFromAttributes , Введите declaringType, Json.MemberSerialization memberSerialization, Boolean & allowNonPublicAccess) в Newtonsoft.Json.Serialization. DefaultContractResolver.CreateProperty (член Reflection.MemberInfo, член Json.MemberSerialization memberSerialization) в Newtonsoft.Json.Serialization.DefaultContractResolver.CreateProperties (тип типа, Json.MemberSerialization memberCractialization) в NewtonsoftResolver. Json.Serialization.DefaultContractResolver.CreateContract (Type objectType) в Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract (Type type) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.GetContractSafe (Type type) в Newtonsoft.Internal.Serialization.Internal.Serialization.Serialization.InternalSerialization.Serialization.Internal.SerializationSaader (Type type) Читатель Json.JsonReader, Тип objectType, Boolean checkAdditionalContent) в Newtonsoft.Json.JsonSerializer.DeserializeInternal (Читатель Json.JsonReader, Тип objectType) в Newtonsoft.Json.JsonSerializer.Deserialize (Читатель Json.JsonReader, Тип objectType) в Ne wtonsoft.Json.JsonConvert.DeserializeObject (строковое значение, тип типа, настройки Json.JsonSerializerSettings)
Похоже, что поиск параметризованного конструктора является основной причиной этой проблемы в .NET Native. Но это но .NET Native или JSON.NET?