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
相关产品推荐
相关产品推荐

