class Attribute1
{
}
class Attribute2 : Attribute1
{
}
class class1
{
Attribute1 attr1;
}
class class2 : class1
{
Attribute2 attr2;
}
var serializerSettings = new JsonSerializerSettings(){TypeNameHandling = TypeNameHandling.Objects};
class2 a = SomeValidObjectoftype Class2;
string serializedClass2 = JsonConvert.SerializeObject(a, serializerSettings);
var am = JsonConvert.DeserializeObject<Class2>(serializedClass1);
以上都是JSON属性和对象。我要做的是序列化和反序列化,而不丢失类型。在反序列化时,我丢失了am.attr2的类型。目前它以Attribute1
的形式回归。我希望它是Attribute2
。这可能吗?如果有的话,有人能告诉我正确的做法吗?我添加了SerializationSettings,但仍然遇到同样的问题。
在反序列化和序列化时必须通过TypeNameHandling = TypeNameHandling.Objects
(或All
或Auto
):
var am = JsonConvert.DeserializeObject<Class2>(serializedClass1, serializerSettings );
我相信这是出于安全原因:这意味着在使用默认设置反序列化期间不能注入意外类型。来自文档:
TypeNameHandling
应谨慎使用,当您的应用程序从外部源反序列化JSON。输入类型应该是反序列化时使用自定义SerializationBinder
进行验证TypeNameHandling.None
以外的值
有关此警告的必要性的讨论,请参阅Newtonsoft Json中的TypeNameHandling警告。
样本小提琴。