C# 使用转换器时Json缺少MemberHandling

C# 使用转换器时Json缺少MemberHandling,c#,serialization,json.net,C#,Serialization,Json.net,使用Json.NET反序列化保存的接口对象而不定义其实现类型当然会引发错误,因此我编写了一个可重用类: public class MakeJsonConverter<TParent, TChild> : JsonConverter where TChild:TParent { private readonly Type _parent; private Type _child; public MakeJsonConverter() {

使用Json.NET反序列化保存的接口对象而不定义其实现类型当然会引发错误,因此我编写了一个可重用类:

public class MakeJsonConverter<TParent, TChild> : JsonConverter where TChild:TParent
{
    private readonly Type _parent;
    private Type _child;

    public MakeJsonConverter()
    {
        _parent = typeof(TParent);
        _child = typeof(TChild);
    }

    public override bool CanConvert(Type objectType)
    {
        return (objectType == _parent);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<TChild>(reader);
    }

    //This should never be called. Only reading from saved interface data was an issue without using a converter.
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
它工作得很好,只是我传递给它的设置似乎没有被使用。事实上我不确定,我只知道缺少MemberHandling。错误不起作用

public virtual string SerializeWithConverter<TParent, TChild>(TParent obj) where TChild : TParent
{
    var settings = new JsonSerializerSettings
    {
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        ContractResolver = new DefaultContractResolver
        {
            DefaultMembersSearchFlags =
                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance
        },
        TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple,
        ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,

        //Settings important to this situation
        MissingMemberHandling = MissingMemberHandling.Error,
        Converters = new List<JsonConverter> { new MakeJsonConverter<TParent, TChild>() }
    };

    return JsonConvert.SerializeObject(obj, Formatting.Indented, settings);
}

我似乎不明白为什么会这样。。有人能解释一下吗?

尝试添加TypeNameHandling=TypeNameHandling。所有操作都是在序列化和反序列化时进行的


这可能有助于反序列化程序,以防您有要反序列化的嵌套对象结构。

当您说MissingMemberHandling.Error不起作用时,具体是什么意思? 我假设这是因为当用户过度/过度发布与您的对象不匹配的对象时,您期望出现错误?不管怎样,我相信当您设置自己的自定义ContractResolver时,MissingMemberHandling.Error不会抛出。相反,创建从DefaultContractResolver继承的自己的类并重写JsonObjectContract。这将提供与您期望的结果类似的结果

    public class CustomContractResolver : DefaultContractResolver
    {
        protected override JsonObjectContract CreateObjectContract(Type objectType)
        {
            var contract = base.CreateObjectContract(objectType);
            contract.ItemRequired = Required.Always;
            return contract;
        }
    }
然后将其用作合同解析程序

ContractResolver = new CustomContractResolver(),

为我测试和工作

这并不能真正回答问题。如果您有不同的问题,可以单击以提问。一旦你有足够的时间,你也可以吸引更多的注意力@沃格斯兰我用一个例子扩展了我的答案。