【发布时间】:2016-08-09 19:36:20
【问题描述】:
当我将 Json.NET 设置为序列化并将 TypeNameHandling 设置为 TypeNameHandling.Auto 时,它会为对象的子属性正确设置 $type,但不会为正在序列化的根对象这样做。为什么?
请考虑以下重现:
public class Animal
{
public Animal[] Offspring { get; set; }
}
public class Dog : Animal {}
Animal fido = new Dog
{
Offspring = new Animal[] { new Dog() }
};
var json = JsonConvert.SerializeObject(fido,
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
发送到json 变量的Json 是:
{
"Offspring": [{
"$type": "MyApp.Dog, MyApp",
"Offspring": null
}]
}
Json.NET Documentation 表示 TypeNameHandling.Auto 的行为是:
当被序列化的对象的类型与其声明的类型不同时,包括 .NET 类型名称。
我的问题是 - 为什么 fido 没有
"$type": "MyApp.Dog, MyApp", 喜欢它的小狗吗? :)
更新:我从this question 接受的答案中发现,我可以通过这样做来强制添加 $type:
var json = JsonConvert.SerializeObject(fido,
typeof(Animal),
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Formatting = Formatting.Indented
});
但我的问题仍然存在 - 为什么 Json.NET 不按照文档自行执行此操作?
【问题讨论】:
标签: serialization types json.net