Сериализация документа mongodb в объекте домена - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь прочитать документ mondodb в свой класс домена (Company), но получаю сообщение об ошибке в одном из свойств. Сообщение об ошибке гласит:

"Ожидается вложенный документ, представляющий сериализованную форму Значение OrgNumber, но вместо него найдено значение типа String "

Объекты выглядят так:

public class OrgNumber
{
    public string Value { get; private set; }
    ...

    private OrgNumber() { }

    public OrgNumber(string value) {
            Value = value;
    }
}

public class Company
{
    public string Name { get; private set; }
    public OrgNumber OrgNumber { get; private set; }
    ...

    private Company() { }

    public Company(string name, OrgNumber orgNumber)
    {
            Name = name;
            OrgNumber = orgNumber;
    }
}

Документ mongodb выглядит так:

{
"name": "Company name",
"orgNumber": "1234-5678",
}

Я читаю документ и отображаю его непосредственно в модель моего домена:

var collection = _mongoDb.GetCollection<Company>("Companies");
var result = await collection.Find(c => c.CompanyId == companyId).SingleOrDefaultAsync();

Как правильно получить строковое представление OrgNumber для правильного типа OrgNumber?

1 Ответ

0 голосов
/ 20 мая 2019

Вы можете создать свой собственный сериализатор, наследующий от SerializerBase<T>

public class OrgNumberSerializer : SerializerBase<OrgNumber>
{
    public override OrgNumber Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        var serializer = BsonSerializer.LookupSerializer(typeof(string));
        var data = serializer.Deserialize(context, args);
        return new OrgNumber(data.ToString());
    }

    public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, OrgNumber value)
    {
        var serializer = BsonSerializer.LookupSerializer(typeof(string));
        serializer.Serialize(context, value.Value);
    }
}

Тогда его необходимо зарегистрировать глобально, используя следующую строку:

BsonSerializer.RegisterSerializer(typeof(OrgNumber), new OrgNumberSerializer());

Подробнее об этом можно узнать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...