您的位置:首页 >C# 高并发下用 JsonSerializerContext 提升性能
发布于2026-02-10 阅读(0)
扫一扫,手机访问
JsonSerializerContext通过预编译序列化逻辑、避免反射与锁竞争、实现线程安全零分配来提升高并发性能;需继承基类、用[JsonSerializable]标记类型、启用源生成,并复用静态实例配合泛型API调用。

因为 JsonSerializerContext 预编译了类型序列化逻辑,避免每次调用 JsonSerializer.Serialize 时重复反射、生成委托、构建缓存键。在高并发场景下,反复创建 JsonSerializerOptions 或依赖默认上下文会触发锁竞争和 GC 压力,而静态复用的 JsonSerializerContext 子类是线程安全且零分配(对已知类型)。
必须继承抽象基类 JsonSerializerContext,用 [JsonSerializable] 标记要支持的类型,并启用源生成(Source Generator)。不能手动 new 它,也不能把它当普通类随意实例化。
.csproj 中添加 <PropertyGroup><EnableDefaultJsonTypeInfoResolver>true</EnableDefaultJsonTypeInfoResolver></PropertyGroup>(.NET 7+ 推荐),或显式引用 System.Text.Json.SourceGeneration 包JsonSerializerContext 子类必须是 public sealed,且构造函数为 internal 或 protectedpublic static partial class MyJsonContext : JsonSerializerContext
{
[JsonSerializable(typeof(Order))]
[JsonSerializable(typeof(List<Order>))]
[JsonSerializable(typeof(Dictionary<string, decimal>))]
public static partial JsonTypeInfo<Order> Order { get; }
public static partial JsonTypeInfo<List<Order>> OrderList { get; }
}
核心原则:复用同一个 JsonSerializerContext 实例,且优先使用泛型重载,避免运行时类型擦除带来的装箱或反射回退。
JsonSerializer.Serialize(output, value, context.Order),而不是 JsonSerializer.Serialize(output, value, options) —— 后者绕过源生成,退化为传统路径JsonTypeInfo<T>,例如 JsonSerializer.Deserialize<Order>(input, MyJsonContext.Order);若只传 context 不传 JsonTypeInfo,会触发内部查找逻辑,失去性能优势JsonSerializerContext 子类都应通过静态属性暴露,如 MyJsonContext.Default 或直接用生成的 static partial 属性源生成不是万能的,很多动态场景它不支持,强行用反而引发运行时异常或静默退化。
T 来自方法参数且未在 [JsonSerializable] 中声明)object、dynamic、ExpandoObject 等无固定结构类型——它们仍走反射路径,且无法被 JsonSerializerContext 捕获obj/Debug/... 下,若清理不彻底,可能引用旧版 JsonTypeInfo 导致序列化结果不一致最常出问题的是「以为加了 [JsonSerializable] 就万事大吉」,实际没检查生成是否成功、没验证泛型绑定是否精确、也没压测对比分配率——这些地方一漏,高并发下的性能收益就归零。
上一篇:STM32官网在线访问地址不收费
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9