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

C#侧无匹配枚举值时如何处理Enum反序列化错误

实现方案

步骤1:自定义Color枚举序列化器

自定义继承自SerializerBase<Color>的序列化器,重写反序列化逻辑,未匹配的取值统一返回Color.Unknown:

using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Serializers;

public class ColorEnumSerializer : SerializerBase<Color>
{
    public override Color Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        var bsonType = context.Reader.GetCurrentBsonType();
        // 处理字符串类型存储的枚举值
        if (bsonType == BsonType.String)
        {
            var value = context.Reader.ReadString();
            if (Enum.TryParse<Color>(value, ignoreCase: true, out var result))
            {
                return result;
            }
            return Color.Unknown;
        }
        // 兼容数值类型存储的枚举值,不需要可删除该段逻辑
        if (bsonType == BsonType.Int32)
        {
            var intValue = context.Reader.ReadInt32();
            if (Enum.IsDefined(typeof(Color), intValue))
            {
                return (Color)intValue;
            }
        }
        return Color.Unknown;
    }

    public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Color value)
    {
        // 序列化保持原有逻辑,把枚举值转为字符串存储
        context.Writer.WriteString(value.ToString());
    }
}

步骤2:注册序列化器

两种注册方式按需选择:

  • 全局注册:程序初始化阶段执行一次即可,所有Color类型的属性都会自动使用该序列化器
BsonSerializer.RegisterSerializer(typeof(Color), new ColorEnumSerializer());
  • 局部指定:仅给指定的Color类型属性启用该序列化器,在实体类对应属性上添加特性即可
[BsonSerializer(typeof(ColorEnumSerializer))]
public Color UserColor { get; set; }

补充说明

如果需要严格匹配枚举值的大小写,把Enum.TryParse方法的ignoreCase参数改为false即可。

内容的提问来源于stack exchange,提问作者someone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 08:06:07