.NET 8 AOT应用中JsonTypeInfo与Json转换器兼容问题求助
.NET 8 AOT下使用System.Text.Json转换器的解决方案
转换器与AOT的兼容性
转换器完全兼容AOT编译,问题的核心是不能同时传递JsonSerializerOptions和JsonTypeInfo给序列化方法,但可以通过将转换器配置到JsonTypeInfo内部来实现需求。
具体解决方法
方法1:通过JsonSerializerOptions生成带转换器的JsonTypeInfo
先将转换器添加到JsonSerializerOptions,再通过JsonSerializer.GetTypeInfo<T>(options)获取包含转换器配置的JsonTypeInfo——AOT编译时,这个方法会被提前生成对应的序列化代码,无需反射。
示例代码:
// 初始化配置并添加自定义转换器 var serializerOptions = new JsonSerializerOptions(); serializerOptions.Converters.Add(new MyCustomConverter()); // 获取带转换器配置的JsonTypeInfo JsonTypeInfo<MyTargetType> typeInfo = JsonSerializer.GetTypeInfo<MyTargetType>(serializerOptions); // 使用该typeInfo进行序列化/反序列化 string jsonString = JsonSerializer.Serialize(myInstance, typeInfo); MyTargetType? deserialized = JsonSerializer.Deserialize(jsonString, typeInfo);
方法2:通过源生成器(Source Generator)配置转换器
如果使用System.Text.Json的源生成器(推荐用于AOT场景),有两种方式将转换器集成到生成的JsonTypeInfo中:
方式A:给目标类型添加[JsonConverter]特性
直接在需要序列化的类型上标记转换器特性,源生成器会自动将转换器纳入生成的JsonTypeInfo:
// 给目标类型绑定转换器 [JsonConverter(typeof(MyCustomConverter))] public class MyTargetType { public int Id { get; set; } public string Name { get; set; } = string.Empty; } // 源生成器上下文类 [JsonSerializable(typeof(MyTargetType))] public partial class AppJsonContext : JsonSerializerContext { } // 使用生成的JsonTypeInfo string json = JsonSerializer.Serialize(myInstance, AppJsonContext.Default.MyTargetType);
方式B:在JsonSerializerContext中全局配置转换器
重写ConfigureJsonOptions方法,在上下文层面添加转换器,对所有注册到该上下文的类型生效:
[JsonSerializable(typeof(MyTargetType))] [JsonSerializable(typeof(AnotherType))] public partial class AppJsonContext : JsonSerializerContext { protected override void ConfigureJsonOptions(JsonSerializerOptions options) { base.ConfigureJsonOptions(options); // 添加全局转换器 options.Converters.Add(new MyCustomConverter()); } }
关键注意事项
- 自定义转换器必须是AOT友好的:避免在转换器内部使用反射,所有涉及的序列化类型需被源生成器覆盖,或在AOT配置文件(
rd.xml)中声明。 - AOT场景下始终优先使用基于
JsonTypeInfo的序列化重载,避免依赖反射的JsonSerializerOptions直接重载,确保编译时生成所有必要代码。
内容的提问来源于stack exchange,提问作者ygoe
相关产品推荐
相关产品推荐

