2017-01-23 60 views
0

我有下面从抽象类继承的具体类:试图去当newtonsoft JSON序列化的抽象类

[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. 是,这是解决这个问题(而且不知道该选择什么都不开盒即用)

  2. 任何性能或消极的影响正确的做法,我应该知道这个设置。

谢谢。

+0

当使用'TypeNameHandling'你需要用一个自定义序列化粘结剂检查输入的类型,出于安全原因。见例如[在Newtonsoft Json中的TypeNameHandling警告](http://stackoverflow.com/q/39565954/3744182)。有关替代策略,请参阅[使用json.net反序列化不使用类型信息的多态json类](http://stackoverflow.com/q/19307752/3744182)。 – dbc

+1

@dbc [此链接](http://stackoverflow.com/questions/29124126/polymorphic-json-deserialization-failing-using-json-net)更好,因为它修复了第二个链接中的错误,如果json对象是递归。 –

回答

0

1.是,这是解决这个问题(而且不知道该选择什么都不开盒即用)
我认为这是对DE /序列化继承类NewtonSoft JSON正确的方法正确的做法。当我们使用设置TypeNameHandling = TypeNameHandling.All来设置/序列化时,序列化时将始终包含.NET类型名称。没有类型信息,转换器很难决定哪个类将被de/serialized。

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