为什么不能反序列化自引用循环? [可以反序列化]

Why self reference loop cannot be deserialized? [It can be deserialized]

看起来没有 C# JSON 序列化框架可以反序列化自引用循环。

但是为什么呢?

假设我们有这个 class 结构:

public class Person
{
    public string Name { get; set; };
    public City City { get; set; }
}

public class City
{
   public string Name { get; set; }
   public List<Person> Persons { get; set; }
}

并且在 serialization/deserialization 设置中我们说如果对象是相同的则放置 $ref 而不是再次序列化对象

连载后的人物会是这样

{
"$id":"1",
"Name":"John",
"City":{
    "$id":"2",
    "Name":"London",
    "Persons":[
        {
           "$ref":"1"
        }
     ]

并且在反序列化时,您只是创建没有城市的人,然后创建带有人的城市,并使用创建的城市 属性 初始化人

    var person = new Person();
    var city = new City();
    city.Persons = new List<Person>{ person };
    person.City = city;

我能找到的一个解释是,如果你没有空的构造函数,你需要先创建参数。

但是即使你有一个,我能找到的所有序列化框架都无法正确反序列化它。

编辑: 它可以被反序列化。

我认为示例中的结构是根据我的真实 class 结构,我的真实结构没有正确反序列化,所以我没有尝试从示例中真正地 serialize/deserialize 结构。然后,当我尝试反序列化时它很好,所以我检查了我的真实结构,它没有正确反序列化的原因是我在 属性.setter 上错过了 setter。

你没有展示对 serialize/deserialize 的任何实际尝试,所以我不知道你尝试了什么,但我花了 30 秒才弄清楚如何用 System.Text.Json 做到这一点所以我建议你试一试。它涉及在 JsonSerializerOptions

中配置 ReferenceHandler 选项
        JsonSerializerOptions options = new()
        {
            ReferenceHandler = ReferenceHandler.Preserve,
            WriteIndented = true
        };

Microsoft page devoted to this topic