假设,我有一个基类
public class Node{
public ObjectId Id;
public String nodeName;
public ObjectId parentNode;
}
和 2 个派生类
public class PlotNode:Node{
public ObjectId Id;
public String plotDetail;
}
public class EndNode:Node{
public ObjectId Id;
public int resultCode;
}
所有3个类的几个对象都被序列化在数据库中。
我拥有的唯一数据是 ObjectId 的列表,关于这些 id 唯一知道的是它们肯定是 Node id,但在反序列化时不知道它们是 Node、PlotNode 还是 EndNode。
我正在使用它来反序列化:
var collection = db.GetCollection<Node>("nodes");
var query = Query<Node>.EQ(e => e.Id, id);
Node node = collection.FindOne(query);
最后我得到的是节点,而不是实际的 PlotNodes 或 EndNodes。
我如何知道它们是否是派生类型之一并取回该类型的对象?
最佳答案
为什么你有相同的“public ObjectId Id;”在每个派生类中? 这不是一个好主意。它隐藏了父 ID 字段。
要解决您的问题,您需要“注册”您的派生类(就像在任何序列化/反序列化机制中一样)。 有3种方法可以做到:
声明方式 - 用以下方式装饰基 Node 类:
[BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
通用方式 - 当类型在编译时已知时:
BsonClassMap.RegisterClassMap<PlotNode>(); BsonClassMap.RegisterClassMap<EndNode>();
动态方式 - 当编译时类型未知时:
BsonClassMap.LookupClassMap(typeof(PlotNode)); BsonClassMap.LookupClassMap(typeof(EndNode));
另一个建议 - use LINQ instead of Query
Node node = collection.AsQueryable().FirstOrDefault(n => n.Id == id);
关于c# - 使用 MongoDB C# 驱动程序反序列化多态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18642693/