用于维护反向引用的序列化模式

本文关键字:序列化 模式 引用 维护 用于 | 更新日期: 2023-09-27 18:29:28

所以如果我在两个对象之间有一对多关系,我只能以一种方式序列化,否则在使用 Json.NET 时会出现循环错误。

我想以两种方式序列化对象,以便我可以上下导航对象。

阅读 Json.NET 的文档,我发现了通过添加以属性名称为后缀的 shouldSerialize 方法来有条件地序列化 C# poco 属性的能力。

参加经理和员工课程。一个经理有很多员工。我希望员工反向引用经理,但我只希望经理在经理不是员工的财产时引用员工。

{ 
  manager: {
   managerId: 1,
   attr1: 'blah',
   employees: [
    {
     employeeId:1,
     manager: {
      manager id: 1,
      attr1: 'blah',
      employees: **null**
     }
   ]
}

这可能做到吗?最好的方法是什么?

用于维护反向引用的序列化模式

如果您以

这种方式使用ShouldSerialize,那么您的反向引用将不是反向引用。 Employee.Manager将指向不同的Manager,而不是在其Employees属性中包含雇员的那个。

您应该改用JsonSerializerSettings.PreserveReferencesHandling,它专门设计用于使交叉链接成为可能并避免对象重复。

class Program
{
    private static void Main ()
    {
        var m = new Manager { Attr = "Attr1" };
        var e = new Employee { Attr = "Attr1", Manager = m };
        m.Employees = new[] { e };
        Console.WriteLine(JsonConvert.SerializeObject(m,
            new JsonSerializerSettings {
                PreserveReferencesHandling = PreserveReferencesHandling.Objects,
                Formatting = Formatting.Indented,
            }));
        Console.ReadKey();
    }
}
class Manager
{
    public Employee[] Employees;
    public string Attr;
}
class Employee
{
    public Manager Manager;
    public string Attr;
}

此代码将输出以下 JSON:

{
  "$id": "1",
  "Employees": [
    {
      "$id": "2",
      "Manager": {
        "$ref": "1"
      },
      "Attr": "Attr1"
    }
  ],
  "Attr": "Attr1"
}

请注意,所有对象现在都具有$id属性,当对象在对象图中第二次出现时,将插入对它的引用而不是对象:{ "$ref": "1" }