SuperAPI AI 工具集

serialization

编程与开发

查看项目

更新于 10-15 08:12

技能介绍

用途

该技能用于在 .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 消息、事件溯源、缓存、配置、日志等序列化决策与实现。

限制

资料未提供该技能的安装命令、运行环境要求、收费或价格信息,暂未提供。