Search code examples
.netjson.netwin-universal-app.net-native

Custom Json Converter with no default Constructor and .NET Native


I'm writing app on Universal Windows Platform (Win10). And had a problem using a custom Json Converter when running on release mode which meaning compile through .NET Native. Here's my converter's code

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;
    }
}

when trigger this converter on release mode. it gets "creation error" exception but it works fine under debug mode.

I've log my exception meesage

HResult : -2146233088 TypeName : Newtonsoft.Json.JsonException, Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed Message : Newtonsoft.Json.JsonException: Error creating 'NestedObjectJsonConverter'. ---> System.NullReferenceException: Object reference not set to an instance of an object. at Newtonsoft.Json.Serialization.JsonTypeReflector.<>c.b__18_1(Object param) at System.Func.Invoke(Runtime.CompilerServices.CallSiteBinder arg) at SharedLibrary!+0x3a908c at SharedLibrary!+0x3b1492 at SharedLibrary!+0x4d376a at Newtonsoft.Json.Serialization.JsonTypeReflector.<>c__DisplayClass18_0.b__0(Object[] parameters) --- End of inner exception stack trace --- at Newtonsoft.Json.Serialization.JsonTypeReflector.<>c__DisplayClass18_0.b__0(Object[] parameters) at System.Func.Invoke(Runtime.CompilerServices.CallSiteBinder arg) at Newtonsoft.Json.Serialization.JsonTypeReflector.GetJsonConverter(Object attributeProvider) at Newtonsoft.Json.Serialization.DefaultContractResolver.SetPropertySettingsFromAttributes(Json.Serialization.JsonProperty property, Object attributeProvider, String name, Type declaringType, Json.MemberSerialization memberSerialization, Boolean& allowNonPublicAccess) at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateProperty(Reflection.MemberInfo member, Json.MemberSerialization memberSerialization) at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateProperties(Type type, Json.MemberSerialization memberSerialization) at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(Type objectType) at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(Type objectType) at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(Type type) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.GetContractSafe(Type type) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(Json.JsonReader reader, Type objectType, Boolean checkAdditionalContent) at Newtonsoft.Json.JsonSerializer.DeserializeInternal(Json.JsonReader reader, Type objectType) at Newtonsoft.Json.JsonSerializer.Deserialize(Json.JsonReader reader, Type objectType) at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, Json.JsonSerializerSettings settings)

It seems finding parameterized constructor is the root cause of this issue in .NET Native. But this is an but of .NET Native or JSON.NET ?


Solution

  • This is a .net Native bug. And it was fixed in current release