我下面是一个具体类,它继承自抽象类:
</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,则错误消失。
我心中的疑问:
这是解决此问题的正确方法(并且不确定此选项是不是开箱即用)
使用此设置我应该注意任何性能或负面影响。
感谢。
答案 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