Старый класс имел свойство типа 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; }
Но не уверен, что это хороший подход.