c# - 使用 MongoDB C# 驱动程序反序列化多态类型

标签 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 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种方法可以做到:

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

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

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

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

关于c# - 使用 MongoDB C# 驱动程序反序列化多态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18642693/

相关文章:

c# - 与 C# 库通信的 native C++ Exe

javascript - Mongo 在单个字段(二维数组)上设置交集

json - 如何将字节流从 reqwest 响应反序列化为 JSON?

deserialization - .Net HttpClient 无法反序列化异常

c# - 在 IJob 接口(interface)的 Execute() 方法执行之间保留数据

c# - 关于dataGridView的Row和Column Headers的问题

c# - 强制将静态类常量作为数据类型

mongodb - 如何从 mongodb-native/node.js 执行存储函数

ruby - 我如何处理从 mongo 返回的任意哈希值(使用 mgo)?

json - 如何使用 Serde 使用顶级数组反序列化 JSON?