自引用属性的反序列化不起作用

Lin*_*usK 4 json.net

我有一个带有Parent属性的对象,该对象引用了另一个相同类型的对象:

[JsonObject(IsReference = true)]
class Group
{
    public string Name { get; set; }

    public Group(string name)
    {
        Name = name;
        Children = new List<Group>();
    }

    public IList<Group> Children { get; set; }

    public Group Parent { get; set; }

    public void AddChild(Group child)
    {
        child.Parent = this;
        Children.Add(child);
    }
}
Run Code Online (Sandbox Code Playgroud)

序列化工作正常,并导致json如下所示:

{
  "$id": "1",
  "Name": "Parent",
  "Children": [
    {
      "$id": "2",
      "Name": "Child",
      "Children": [],
      "Parent": {
        "$ref": "1"
      }
    }
  ],
  "Parent": null
}
Run Code Online (Sandbox Code Playgroud)

但是反序列化是行不通的。Parent属性返回null。

测试看起来像这样:

[Test]
public void Test()
{
    var child = new Group("Child");
    var parent = new Group("Parent");
    parent.AddChild(child);

    var json = JsonConvert.SerializeObject(parent, Formatting.Indented);
    Debug.WriteLine(json);

    var deserializedParent = (Group) JsonConvert.DeserializeObject(json, typeof(Group));
    Assert.IsNotNull(deserializedParent.Children.First().Parent);
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?任何帮助表示赞赏!

Jam*_*ing 5

使用引用不适用于仅具有参数构造函数的对象。

Json.NET必须先反序列化所有子级值,然后再创建父级,它需要将这些值传递给构造函数,因此没有有效的父级引用来分配给子级。