使用System.Text.Json序列化泛型类对象时泛型属性序列化异常
问题分析
你遇到的问题核心在于:System.Text.Json默认的JsonStringEnumConverter仅处理具体枚举类型,当泛型参数为抽象基类Enum时,序列化器无法识别枚举实例的实际类型,只能将其当作object处理,最终输出空对象{}。
解决方案:自定义枚举基类转换器
我们可以实现一个专门处理Enum基类的自定义转换器,让序列化器能识别枚举实例的实际类型并正确序列化为字符串。
自定义转换器代码
public class EnumBaseConverter : JsonConverter<Enum> { private readonly JsonStringEnumConverter _innerConverter; public EnumBaseConverter() { _innerConverter = new JsonStringEnumConverter(); } public override bool CanConvert(Type typeToConvert) { return typeof(Enum).IsAssignableFrom(typeToConvert); } public override Enum? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 反序列化逻辑,可根据实际需求扩展 return _innerConverter.Read(ref reader, typeToConvert, options) as Enum; } public override void Write(Utf8JsonWriter writer, Enum value, JsonSerializerOptions options) { // 获取枚举实例的实际类型,而非基类Enum var actualEnumType = value.GetType(); // 委托内部转换器处理实际枚举类型的序列化 _innerConverter.Write(writer, value, actualEnumType, options); } }
修改序列化配置
将原来的JsonStringEnumConverter替换为自定义转换器:
JsonSerializerOptions options = new JsonSerializerOptions(); options.Converters.Add(new EnumBaseConverter()); var result = JsonSerializer.Serialize(algorithm1, options); Console.WriteLine(result);
最终输出结果
运行后会得到你期望的序列化内容:{"Steps":[{"Type":"Type1","Value":"Bla"},{"Type":"Type2","Value":"Etc"}]}
补充说明
- 该转换器兼容所有继承自
Enum的具体枚举类型,无需为每个枚举单独配置。 - 如果需要支持反序列化,可以结合
AlgorithmType字段的标识,在Read方法中判断应转换为哪个具体枚举类型,进一步完善逻辑。
内容的提问来源于stack exchange,提问作者Dido
相关产品推荐
相关产品推荐

