编辑2016-12-05: 这被认为是一个错误并已修复:Readonly property corrupts normal property object references. #486
原帖:
我刚刚开始使用Json.NET,但遇到了一些看似错误的奇怪行为。
如果Deserializer遇到最初在readonly属性(get; only)中定义的对象引用(" $ ref":" 2"),则无法反序列化并返回相反。
类
public class Parent
{
public Child ReadOnlyChild
{
get
{
return Child;
}
}
public Child Child {get; set;}
}
public class Child
{
}
序列化:
Parent p = new Parent() { Child = new Child() };
JsonConvert.SerializeObject(p, new JsonSerializerSettings()
{ Formatting = Formatting.Indented,
PreserveReferencesHandling = PreserveReferencesHandling.Objects });
序列化:
{
"$id": "1",
"ReadOnlyChild": {
"$id": "2",
},
"Child": {
"$ref": "2"
}
}
反序列化(& reserialized以显示更改):
{
"$id": "1",
"ReadOnlyChild": null,
"Child": null
}
这是预期的行为,是一个错误,还是我错过了什么?
请注意,有时需要[JsonProperty(Order =#)]来强制序列化程序首先对ReadOnlyChild进行操作。无论如何,上面的序列化JSON块将无法正确反序列化,即使该类已被修改为首先反序列化Child。
编辑:被隐藏的Child属性是我的关注点,而不是由Json.NET以某种方式为ReadOnlyChild分配值
谢谢!
答案 0 :(得分:1)
您是否考虑过仅阻止Json.Net对该属性进行序列化?
public class Parent
{
[JsonIgnore]
public Child ReadOnlyChild
{
get
{
return Child;
}
}
public Child Child {get; set;}
}