You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:53:13