Десериализовать Enum, хранящийся в MongoDB как Int32, в его строковое значение - PullRequest
0 голосов
/ 08 сентября 2018

Старый класс имел свойство типа enum. И Монго хранил его как Int32.

public Enums.DStatus Status {get;set;}

Свойство изменено на строку

public string Status  { get; set; }

Теперь, когда я получаю объект с этим свойством из Mongo, я получаю сообщение об ошибке:

Невозможно десериализовать 'String' из BsonType 'Int32'. --->

Я думаю, что моим решением может быть написание специального десериализатора, который преобразует это конкретное свойство, когда его значение равно «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();
            }
        }
        }

и затем добавьте атрибут к свойству класса:

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

Но не уверен, что это хороший подход.

...