将以Int32格式存储在MongoDB中的Enum反序列化为其字符串值

时间:2018-09-08 20:21:08

标签: c# mongodb serialization deserialization bson

旧类具有枚举类型的属性。然后Mongo将其存储为Int32。

public Enums.DStatus Status {get;set;}

该属性已更改为字符串

public string Status  { get; set; }

现在,当从Mongo检索具有该属性的对象时,出现错误:

  

无法从BsonType'Int32'反序列化'String'。 --->

我认为我的解决方案可以编写一个自定义反序列化器,当该特定属性的值为“ Int32”时,它将将该特定属性转换为其枚举字符串值。而且我认为我可以保留默认的序列化程序。

我在想这样的事情:

    public class DStatusSerializer : SerializerBase<string>
        {
            public override string Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
            {
                var type = context.Reader.GetCurrentBsonType();
                if (type == BsonType.Int32)
                {
                    int i = context.Reader.ReadInt32();
                    string s = ((Enums.DStatus)i).ToString();
                    return s;
                }
                else if (type == BsonType.String)
                {
                    return context.Reader.ReadString();
                }
                else
                {
                    throw new Exception("Incorrect data type: " + type.ToString());
                }

            }

    public override void Serialize(BsonSerializationContext context, 
    BsonSerializationArgs args, string value)
        {
            if (value != null)
            {
                context.Writer.WriteString(value.ToString());
            }
            else
            {
                context.Writer.WriteNull();
            }
        }
    public override void Serialize(BsonSerializationContext context, 
    BsonSerializationArgs args, string value)
        {
            if (value != null)
            {
                context.Writer.WriteString(value.ToString());
            }
            else
            {
                context.Writer.WriteNull();
            }
        }
        }

,然后将该属性添加到class属性:

[BsonSerializer(typeof(DStatusSerializer))]
public string Status { get; set; }

但不确定这是否是一种好方法。

0 个答案:

没有答案