用途
该技能用于在 .NET 应用中为跨进程边界的场景选择正确的序列化格式,适用于:为 API、消息传递或持久化选择序列化格式;从 Newtonsoft.Json 迁移到 System.Text.Json;实现 AOT 兼容的序列化;为分布式系统设计线格式(wire format);优化序列化性能。
主要能力
基于架构 vs 基于反射
技能给出两类格式的对比:基于架构的格式(Protobuf、MessagePack、System.Text.Json 源生成)不在负载中嵌入类型信息,版本化通过显式字段编号/名称实现,性能快(无反射),AOT 兼容,线格式兼容性优秀;基于反射的格式(Newtonsoft.Json、BinaryFormatter)在负载中嵌入类型名,版本化隐式依赖类型结构,性能较慢,不兼容 AOT,线格式兼容性差。建议任何跨进程边界的内容都使用基于架构的序列化。
格式推荐
- REST API:System.Text.Json(源生成),标准且 AOT 兼容
- gRPC:Protocol Buffers,原生格式,版本化优秀
- Actor 消息:MessagePack 或 Protobuf,紧凑、快速、版本安全
- 事件溯源:Protobuf 或 MessagePack,需永久处理旧事件
- 缓存:MessagePack,紧凑快速
- 配置:JSON(System.Text.Json),人类可读
- 日志:JSON(System.Text.Json),结构化可解析
应避免的格式
- BinaryFormatter:安全漏洞、已弃用,绝不使用
- Newtonsoft.Json 默认配置:负载中含类型名,重命名会破坏
- DataContractSerializer:复杂、版本化差
- XML:冗长、慢、复杂
System.Text.Json 与源生成器
通过定义 JsonSerializerContext 并标注 [JsonSerializable] 与 [JsonSourceGenerationOptions],可实现编译期生成类型信息,带来无运行时反射、AOT 兼容、更快、裁剪安全等好处。示例包含序列化/反序列化调用及在 ASP.NET Core 中通过 TypeInfoResolverChain 配置。
Protocol Buffers
适用于 Actor 系统、gRPC、事件溯源及任何长期存在的线格式。通过 dotnet add package Google.Protobuf 与 Grpc.Tools 安装,使用 .proto 定义消息。版本化规则:新增字段(新编号)安全;移除字段需保留编号(reserved)安全;更改字段类型不安全;复用字段编号不安全。
MessagePack
适用于高性能场景、紧凑负载、Actor 消息。通过 dotnet add package MessagePack 与 MessagePack.Annotations 安装,使用 [MessagePackObject] 与 [Key(n)] 标注。AOT 兼容需使用源生成器(partial 类)并配置 CompositeResolver。
从 Newtonsoft.Json 迁移
列出常见差异与修复:$type 需改用判别器或自定义转换器;JsonProperty 对应 JsonPropertyName;DefaultValueHandling 与 NullValueHandling 对应 DefaultIgnoreCondition;私有 setter 需 [JsonInclude];多态使用 [JsonDerivedType](.NET 7+)。并给出迁移模式示例。
多态与判别器
使用 [JsonDerivedType] 标注基类,序列化时以显式判别器(如 "credit_card")区分类型。
线格式兼容模式
- 宽容读取:旧代码安全忽略未知字段(Protobuf/MessagePack 自动;System.Text.Json 配置 UnmappedMemberHandling.Skip)
- 先读后写:先部署反序列化器,再在下一版本启用序列化器
- 不嵌入类型名:使用显式判别器而非程序集限定类型名,保证重构安全
性能对比
以星级近似吞吐量对比:MessagePack 与 Protobuf 在序列化、反序列化、体积上均为五星;System.Text.Json(源生成)序列化/反序列化四星、体积三星;System.Text.Json(反射)三项三星;Newtonsoft.Json 序列化/反序列化两星、体积三星。热路径建议使用 MessagePack 或 Protobuf。
Akka.NET 序列化
为 Akka.NET Actor 系统配置基于架构的序列化,通过 HOCON 配置指定 messagepack 序列化器及 serialization-bindings。
最佳实践
应做:为 System.Text.Json 使用源生成器;使用显式字段编号/键;使用 record 定义不可变消息类型。不应做:使用 BinaryFormatter;在线格式中嵌入类型名(如 TypeNameHandling.All);在热路径使用反射序列化。
使用方式
该技能以文档形式提供指导与代码示例,用户可依据场景选择格式,并按示例进行包安装、上下文定义、特性标注与配置。
适用场景
.NET 应用的 API、gRPC、Actor 消息、事件溯源、缓存、配置、日志等序列化决策与实现。
限制
资料未提供该技能的安装命令、运行环境要求、收费或价格信息,暂未提供。