现在有一个业务场景,有一个雇员类,里面有一个管理者的属性,也是雇员类这种类型,普通雇员的管理者是经理,经理的管理者是CEO,CEO的管理要么是空,要么是自己管理自己,空是正常的,但如果CEO的管理者是自己,用.NET9实现,如下:
using System.Text.Json;
var ceo = new Employee { NO = 1, Name = “CEO” };
ceo.Manager = ceo; // 这里报错
Console.WriteLine(JsonSerializer.Serialize(ceo));
Console.WriteLine(“—————“);
var manager = new Employee { NO = 2, Name = “Manager” };
manager.Manager = ceo;
Console.WriteLine(JsonSerializer.Serialize(manager));
Console.WriteLine(“—————“);
var employee = new Employee { NO = 3, Name = “Employee” };
employee.Manager = manager;
Console.WriteLine(JsonSerializer.Serialize(employee));
class Employee
{
public int NO { get; set; }
public string? Name { get; set; }
public Employee? Manager { get; set; }
}
运行,报错结果如下,出现了循环引用的异常:
当使用源生成器进行 JSON 序列化时,生成的上下文在序列化或反序列化循环引用时会抛出异常。现在,可以通过在 JsonSourceGenerationOptionsAttribute 中指定 ReferenceHandler 来自定义此行为。以下是使用 JsonKnownReferenceHandler.Preserve 的示例:
using System.Text.Json;
using System.Text.Json.Serialization;
var ceo = new Employee { NO = 1, Name = “CEO” };
ceo.Manager = ceo;
Console.WriteLine(JsonSerializer.Serialize(ceo, ContextWithPreserveReference.Default.Employee));
Console.WriteLine(“—————“);
var manager = new Employee { NO = 2, Name = “Manager” };
manager.Manager = ceo;
Console.WriteLine(JsonSerializer.Serialize(manager, ContextWithPreserveReference.Default.Employee));
Console.WriteLine(“—————“);
var employee = new Employee { NO = 3, Name = “Employee” };
employee.Manager = manager;
Console.WriteLine(JsonSerializer.Serialize(employee, ContextWithPreserveReference.Default.Employee));
Console.ReadLine();
[JsonSourceGenerationOptions(ReferenceHandler = JsonKnownReferenceHandler.Preserve)]
[JsonSerializable(typeof(Employee))]
internal partial class ContextWithPreserveReference : JsonSerializerContext
{
}
class Employee
{
public int NO { get; set; }
public string? Name { get; set; }
public Employee? Manager { get; set; }
}
运行结果如下:

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/425607.html