我有一个类,我将其作为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
部分,效果很好。给定正确的类Type
,BsonDocument.Deserialize
返回该Type
的对象实例。虽然此处的问题是我仍然无法Deserialize
代表BsonDocument
的顶级MyClass
,因为它仍保留与IntRef
相关的子文档。 有没有办法告诉Deserialize
忽略BsonDocument
的一部分? 我有想法设置MyBsonDocument[SubDocName] = null
虽然它不可为空。< / em>的
答案 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 serialization,an SO post概述了解决方案。