简体   繁体   English

将mongodb文档序列化为域对象

[英]Serialize mongodb document to domain object

I'm trying to read a mondodb document into my domain class ( Company ) but get an error on one of the properties. 我正在尝试将mondodb文档读入我的域类( Company ),但其中一个属性出现错误。 The error message reads: 错误消息显示为:

"Expected a nested document representing the serialized form of a OrgNumber value, but found a value of type String instead" “期望一个嵌套的文档表示一个OrgNumber值的序列化形式,但是却找到了String类型的值”

The objects looks like this: 对象看起来像这样:

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;
    }
}

The mongodb document looks like this: mongodb文档如下所示:

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

I'm reading the document and mapping it directly into my domain model: 我正在阅读文档,并将其直接映射到我的域模型中:

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

How do I correctly get the string representation of OrgNumber to the correct type OrgNumber ? 如何将OrgNumber的字符串表示形式正确获取为正确的类型OrgNumber

You can create your own serializer inheriting from SerializerBase<T> 您可以创建继承自SerializerBase<T>自己的序列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);
    }
}

Then it needs to be registered globally using below line: 然后,需要使用以下代码行进行全局注册:

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

You can find more about the details here 您可以在此处找到更多有关详细信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM