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

Passing Type information to MongoDB so it can deserialize interface types properly?

我有一个 class 序列化为 MongoDB 作为 BsonDocument,这个 class 也恰好有一个 属性 类型 IMyInterface.

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

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

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

反序列化时 BsonDocument.Deserialize 没有关于 IntRef 指向的 class 的 Type 的信息并抛出异常。 如何向 Deserialize 的呼叫提供 Type 信息?

我也有一个天真的工作,我 Deserialize 文档的 IntRef 部分,效果很好。给定 class TypeBsonDocument.Deserialize returns Type 的对象实例。虽然这里的问题是我仍然无法 Deserialize 表示 MyClass 的顶级 BsonDocument,因为它仍然包含属于 IntRef 的子文档。 有没有办法告诉 Deserialize 忽略 BsonDocument 的一部分? 我的想法是只设置 MyBsonDocument[SubDocName] = null 虽然它不可为空。

由于 MyClass 指向一个接口类型,它可以容纳任何实现该接口的 class' Bson,我们必须告诉 MongoDB class' 可以在该(所有)界面的末尾。然后它可以从 classes 推断出它知道如何反序列化包含那些 class' Bson 的某些 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>();
}

通过将 class MyIntImpl 添加到 BsonClassMap,它现在知道如何从 class 类型反序列化 Bson。您只需要确保地图中充满了 class 实现您可能序列化的接口的元素。

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