惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
博客园 - Franky
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
阮一峰的网络日志
阮一峰的网络日志
量子位
雷峰网
雷峰网
宝玉的分享
宝玉的分享
V
Visual Studio Blog
博客园_首页
小众软件
小众软件
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
S
SegmentFault 最新的问题
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学

博客园 - 桂素伟

Semantic Kernel:开启MCP Semantic Kernel:Phi-4 mini的tools .NET10:字符数字 Semantic Kernel:接入本地deepseek-r1:1.5b Semantic Kernel:接入azure中的deepseek-r1 C#中的Channel .NET9中基于策略角色验证的包冲突 .NET9中使用Options Semantic Kernel:OpenAPI的Plugin Semantic Kernel:Phi-4试用 AI应用开发的浅见 Semantic Kernel:Process Semantic Kernel:新Agent代理 UnitsNet 库简介 .NET9里WinForm更新了什么 SemanticKernel系列,AI系列,SmartFill介绍视频系列 更流畅的asp.net api的错误返回 用.srt字幕文件生成.wav语音 自制实时翻译小工具
.NET10:解决json序列化时引用自己
桂素伟 · 2025-03-10 · via 博客园 - 桂素伟

  现在有一个业务场景,有一个雇员类,里面有一个管理者的属性,也是雇员类这种类型,普通雇员的管理者是经理,经理的管理者是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; }
}

  运行结果如下:

  文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

****欢迎关注我的asp.net core系统课程****
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524