我有一个具体的类,它继承了抽象类:
[Serializable]
public class MyConcreteClass : MyAbstractClass
{
public string MyProperty { get; set; }
}
[Serializable]
public abstract class MyAbstractClass { }
NewtonSoft JSON序列化程序在尝试反序列化MyconcreteClass类时引发以下异常:
Newtonsoft.Json.JsonSerializationException:无法创建MyAbstractClass类型的实例。类型是接口或抽象类,并且无法实例化。路径
在谷歌上搜索了一下,发现以下设置:
var settings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All
};
如果我使用上面的设置,即TypeNameHandling.All,错误就会消失。
我脑海中的问题:
这是解决这个问题的正确方法吗(不确定这个选项是什么)
我应该意识到这种设置的任何性能或负面影响。
谢谢。
1。这是解决这个问题的正确方法吗(不确定这个选项是什么)
我认为用NewtonSoft JSON对继承类进行反序列化是正确的方法。当我们使用设置TypeNameHandling=TypeNameHandling.All进行反序列化时,序列化时将始终包含.NET类型名称。如果没有类型信息,转换器很难决定要对哪个类进行反序列化。
2.我应该注意此设置的任何性能或负面影响
如Json.NET文档中所述,当应用程序从外部源反序列化Json时,应谨慎使用TypeNameHandling,并且当使用TypeNameHandle以外的值反序列化时,应创建自定义SerializationBinder。无。
您可以引用以下链接http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_TypeNameHandling.htmhttps://mallibone.com/post/serialize-object-inheritance-with-json.net