用于抽象类的newtonsoft json序列化程序

时间:2017-01-23 02:52:50

标签: c# json serialization json.net

我下面是一个具体类,它继承自抽象类:

                    </div>
                </div>
            </div>
        </div>

NewtonSoft JSON Serializer在尝试取消/序列化MyconcreteClass类时抛出异常:

  

Newtonsoft.Json.JsonSerializationException:无法创建   MyAbstractClass类型的实例。 Type是接口或抽象   class,无法实例化。路径......

进行了一些谷歌搜索并在下面找到了这个设置:

[Serializable]
public class MyConcreteClass : MyAbstractClass
{
    public string MyProperty { get; set; }
}

[Serializable]
public abstract class MyAbstractClass { }

如果我使用上面的设置,即TypeNameHandling.All,则错误消失。

我心中的疑问:

  1. 这是解决此问题的正确方法(并且不确定此选项是不是开箱即用)

  2. 使用此设置我应该注意任何性能或负面影响。

  3. 感谢。

1 个答案:

答案 0 :(得分:1)

<强> 1。这是解决此问题的正确方法(并且不确定此选项不是开箱即用)
我认为使用NewtonSoft JSON对继承类进行de / serialize是正确的方法。当我们使用 TypeNameHandling = TypeNameHandling.All 进行反序列化时,序列化时将始终包含.NET类型名称。没有类型信息,转换器很难决定哪个类将被去序列化。

<强> 2。使用此设置我应该注意的任何性能或负面影响。
正如Json.NET文档中所述,当您的应用程序从外部源反序列化JSON时,应谨慎使用TypeNameHandling,并且在使用TypeNameHandling.None以外的值进行反序列化时应创建自定义SerializationBinder。
您可以参考以下链接 http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_TypeNameHandling.htm https://mallibone.com/post/serialize-object-inheritance-with-json.net