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仍然遇到了同样的问题。
答案 0 :(得分:1)
您需要在反序列化和序列化时传递TypeNameHandling = TypeNameHandling.Objects
(或All
或Auto
):
var am = JsonConvert.DeserializeObject<Class2>(serializedClass1, serializerSettings );
我认为这是出于安全原因:这意味着在使用默认设置进行反序列化期间无法注入意外类型。来自docs:
申请时应谨慎使用
TypeNameHandling
从外部源反序列化JSON。传入类型应该是 使用a反序列化时使用自定义SerializationBinder
进行验证 除TypeNameHandling.None
以外的其他值。
有关此警告需要的讨论,请参阅TypeNameHandling caution in Newtonsoft Json。
示例fiddle。