当readonly属性与对象引用一起使用时,Json.NET失败了吗?

时间:2015-02-12 22:50:56

标签: c# .net json serialization json.net

编辑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分配值

谢谢!

1 个答案:

答案 0 :(得分:1)

您是否考虑过仅阻止Json.Net对该属性进行序列化?

public class Parent
{
    [JsonIgnore] 
    public Child ReadOnlyChild
    {
        get
        {
            return Child;
        }
    }

    public Child Child {get; set;}
}