将类型信息传递给MongoDB,以便它可以正确地反序列化接口类型?

时间:2016-04-04 20:12:03

标签: c# mongodb serialization bson

我有一个类,我将其作为BsonDocument序列化到MongoDB中,此类也恰好具有IMyInterface类型的属性。

public interface IMyInterface
{
    String Name { get; set; }
}

public class MyClass
{
    public IMyInterface IntRef { get; set; }
}

MyClass对象实例中,生存期IntRef可以引用实现IMyInterface的多个不同类。在序列化后,我发现IntRef指向的类中的所有数据也在BsonDocument中序列化,而不仅仅是Name

反序列化虽然BsonDocument.Deserialize没有关于Type指向的类IntRef的信息并抛出异常。 如何在Type的来电中提供Deserialize信息?

我还有一个天真的工作,我Deserialize文档的IntRef部分,效果很好。给定正确的类TypeBsonDocument.Deserialize返回该Type的对象实例。虽然此处的问题是我仍然无法Deserialize代表BsonDocument的顶级MyClass,因为它仍保留与IntRef相关的子文档。 有没有办法告诉Deserialize忽略BsonDocument的一部分? 我有想法设置MyBsonDocument[SubDocName] = null虽然它不可为空。< / em>的

1 个答案:

答案 0 :(得分:1)

由于<div id="output"> </div>指向一个接口类型,然后可以保存实现该接口的任何类'Bson,我们必须告诉MongoDB最后可以的类的类型(所有接口。然后它可以从类中推断出它知道如何反序列化包含那些类'Bson的某些MyClass

BsonDocuments

通过将类public interface IMyInterface { String Name { get; set; } } public class MyIntImpl : IMyInterface { public String Name { get; set; } } public class MyClass { public IMyInterface IntRef { get; set; } public MyClass() { IntRef = new MyIntImpl(); } } // When starting up MongoDB private void RegisterClasses() { BsonClassMap.RegisterClassMap<MyIntImpl>(); } 添加到BsonClassMap,它现在知道如何从该类类型反序列化Bson。您只需确保使用实现可能序列化的接口的类来填充映射。

一些参考链接:High to low level overview of C# MongoDB serializationan SO post概述了解决方案。