派生类型的JSON反序列化


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(或AllAuto):

var am =  JsonConvert.DeserializeObject<Class2>(serializedClass1, serializerSettings );

我相信这是出于安全原因:这意味着在使用默认设置反序列化期间不能注入意外类型。来自文档:

TypeNameHandling应谨慎使用,当您的应用程序从外部源反序列化JSON。输入类型应该是反序列化时使用自定义SerializationBinder进行验证TypeNameHandling.None以外的值

有关此警告的必要性的讨论,请参阅Newtonsoft Json中的TypeNameHandling警告。

样本小提琴。

相关内容

  • 没有找到相关文章

最新更新