Qua*_*uad 11 c# mongodb deserialization mongodb-.net-driver
假设,我有一个基类
public class Node{
public ObjectId Id;
public String nodeName;
public ObjectId parentNode;
}
Run Code Online (Sandbox Code Playgroud)
和2个派生类
public class PlotNode:Node{
public ObjectId Id;
public String plotDetail;
}
public class EndNode:Node{
public ObjectId Id;
public int resultCode;
}
Run Code Online (Sandbox Code Playgroud)
序列化的所有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);
Run Code Online (Sandbox Code Playgroud)
最后我得到节点,而不是实际的PlotNodes或EndNodes.
我怎么知道它们是否是派生类型之一并获得该类型的对象?
小智 21
为什么你有相同的"公共ObjectId ID;" 在每个派生类?这不是一个好主意.它隐藏了父Id字段.
要解决您的问题,您需要"注册"派生类(如任何序列化/反序列化机制).有3种方法可以做到:
声明方式 - 用以下方式装饰基类Node类:
[BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
Run Code Online (Sandbox Code Playgroud)通用方式 - 在编译时知道类型:
BsonClassMap.RegisterClassMap<PlotNode>();
BsonClassMap.RegisterClassMap<EndNode>();
Run Code Online (Sandbox Code Playgroud)动态方式 - 在编译时未知类型:
BsonClassMap.LookupClassMap(typeof(PlotNode));
BsonClassMap.LookupClassMap(typeof(EndNode));
Run Code Online (Sandbox Code Playgroud)
另一个建议 - 使用LINQ而不是Query
Node node = collection.AsQueryable().FirstOrDefault(n => n.Id == id);
Run Code Online (Sandbox Code Playgroud)