Пользовательский конвертер Json без конструктора по умолчанию и .NET Native

Я пишу приложение на универсальной платформе 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?


person FatJohn    schedule 07.12.2015    source источник
comment
Я бы предложил установить ваш проект в режим DEBUG, но с включенным .NET Native (для этого есть флажок в свойствах вашего проекта). Это должно вызвать исключения с некоторыми полезными сообщениями. Обновление до VS Update 1 также может быть полезным.   -  person MattWhilden    schedule 08.12.2015
comment
@MattWhilden: ОК ~ Спасибо ~ Я попробую этот вариант   -  person FatJohn    schedule 08.12.2015
comment
@WiredPrairie: при десериализации и запуске этого конвертера. Будет выдано исключение ошибки создания из JSON.NET.   -  person FatJohn    schedule 08.12.2015


Ответы (1)


Это ошибка .net Native. И это было исправлено в текущем выпуске

person FatJohn    schedule 21.06.2016