为什么不能反序列化自引用循环? [可以反序列化]
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
};
看起来没有 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
};