如何在.NET 8中以AOT友好方式全局序列化枚举为蛇形小写字符串?
全局为枚举应用蛇形小写序列化(AOT友好)
你可以通过自定义枚举转换器+源生成上下文配置的方式实现AOT兼容的全局蛇形小写枚举序列化,步骤如下:
1. 创建预配置蛇形小写的枚举转换器
定义一个继承自JsonStringEnumConverter的转换器,默认绑定JsonNamingPolicy.SnakeCaseLower命名策略:
public class SnakeCaseStringEnumConverter : JsonStringEnumConverter { public SnakeCaseStringEnumConverter() : base(JsonNamingPolicy.SnakeCaseLower) { } }
2. 在源生成上下文全局指定该转换器
在你的JsonSerializerContext子类上,通过[JsonSourceGenerationOptions]的EnumConverterType属性,全局设置所有枚举使用这个自定义转换器,同时保持属性的蛇形小写命名策略:
[JsonSourceGenerationOptions( DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, PropertyNamingPolicy = JsonKnownNamingPolicy.SnakeCaseLower, EnumConverterType = typeof(SnakeCaseStringEnumConverter) )] public partial class MyAppJsonContext : JsonSerializerContext { // 声明需要序列化的目标类型,例如: public static readonly MyAppJsonContext Default = new(); }
这样配置后,所有通过该上下文序列化的枚举都会自动转为蛇形小写格式,且完全兼容AOT编译——源生成器会提前为所有涉及的枚举生成对应的序列化代码,无需依赖反射。
补充说明
- 直接组合
UseStringEnumConverter = true和NamingPolicy = JsonKnownNamingPolicy.SnakeCaseLower无法为枚举应用蛇形策略,因为UseStringEnumConverter默认使用的是系统默认命名策略,必须通过EnumConverterType指定带预配置策略的转换器才能生效。 - 确保所有需要序列化的类型都在
JsonSerializerContext中声明,或者通过源生成的其他方式覆盖,保证AOT能正确生成对应代码。
内容的提问来源于stack exchange,提问作者Juan Zamudio
相关产品推荐
相关产品推荐

