c# - 当 C# 端没有等效值时,我们如何处理 Enum 的反序列化错误?

标签 c# mongodb serialization

在我的 C# 代码中,我有一个枚举类型,它将作为字符串存储在 MongoDB 中。在我的 C# 代码中,我有这种类型:

public enum Color
{
    Unknown =0,
    Red =1,
    Blue =2,
    Brown =3,
}

当 MongoDB 中的字符串值是红色、蓝色或棕色时,没有问题,但有时在数据库中,还有其他颜色未包含在我的枚举类型中,例如黑色,在这种情况下,我希望颜色反序列化为未知,但我反序列化错误表明黑色未定义。有什么办法可以处理这个问题吗?我无法添加我这边的每种颜色,也无法将枚举类型更改为任何其他类型。我想知道如何将其反序列化为 Unknown?

最佳答案

您将需要一个自定义序列化器,如下所示:

public class ColorSerializer : SerializerBase<Color>
{
    public override void Serialize(BsonSerializationContext ctx, BsonSerializationArgs args, Color value)
    {
        ctx.Writer.WriteString(value.ToString());
    }

    public override Color Deserialize(BsonDeserializationContext ctx, BsonDeserializationArgs args)
    {
        return
            ctx.Reader.CurrentBsonType switch
            {
                MongoDB.Bson.BsonType.String => ctx.Reader.ReadString() switch
                {
                    "Red" => Color.Red,
                    "Blue" => Color.Blue,
                    "Brown" => Color.Brown,
                    _ => Color.Unknown,
                },
                _ => Color.Unknown,
            };
    }
}

在应用程序启动期间将其注册到序列化器注册表中,如下所示:

BsonSerializer.RegisterSerializer(typeof(Color), new ColorSerializer());

完成!

关于c# - 当 C# 端没有等效值时,我们如何处理 Enum 的反序列化错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67765655/

相关文章:

c# - 获取列表中的下一个元素

mongodb - Doctrine MongoDB ODM 的原子操作

shell - 如何在 mongodb 函数中执行 mongodb 查询?

c# - 单次序列化/反序列化大对象与多次序列化/反序列化小对象?

c# - 动态创建的链接按钮列表,链接按钮不回发

c# - 用于大内容的 WPF 多行文本框

c# - 解析 XML 文件 - 选项?

node.js - 蒙戈错误: failed to connect to server [<docker-machine>:<port>] on first connect

haskell - 仅使用 Show/Read 将 Haskell 数据结构序列化到磁盘是否是一种合理的做法

c# - 序列化为 JSON 时如何将类放入对象中