将类型信息传递给 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 Type
、BsonDocument.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 概述了解决方案。
我有一个 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 Type
、BsonDocument.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 概述了解决方案。