11

假设,我有一个基类

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。

我如何知道它们是否是派生类型之一并取回该类型的对象?

4

1 回答 1

30

为什么你有相同的“公共 ObjectId Id;” 在每个派生类中?这不是一个好主意。它隐藏了父 ID 字段。

要解决您的问题,您需要“注册”您的派生类(就像在任何序列化/反序列化机制中一样)。有3种方法可以做到:

  1. 声明方式- 用以下方式装饰基 Node 类:

    [BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
    
  2. 通用方式- 当类型在编译时已知时:

    BsonClassMap.RegisterClassMap<PlotNode>();
    BsonClassMap.RegisterClassMap<EndNode>();
    
  3. 动态方式- 在编译时类型未知时:

    BsonClassMap.LookupClassMap(typeof(PlotNode));
    BsonClassMap.LookupClassMap(typeof(EndNode));
    

于 2013-09-17T10:08:36.767 回答