使用MongoDB C#Driver反序列化多态类型

时间:2013-09-05 17:42:42

标签: c# mongodb deserialization mongodb-.net-driver

假设我有一个基类

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 ids,但是它们在反序列化时间内不知道它们是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。

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

1 个答案:

答案 0 :(得分:20)

为什么你有相同的“public 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));