使用MongoDB C#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("nodes"); var query = Query.EQ(e => e.Id, id); Node node = collection.FindOne(query);
最后我得到节点,而不是实际的PlotNodes或EndNodes。
我怎么知道它们是否是派生类型之一并获得该类型的对象?
为什么你有相同的“公共ObjectId ID;” 在每个派生类? 这不是一个好主意。 它隐藏了父Id字段。
要解决您的问题,您需要“注册”派生类(如任何序列化/反序列化机制)。 有3种方法可以做到:
-
声明方式 – 用以下方法装饰基类Node类:
[BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
-
通用方式 – 在编译时知道类型:
BsonClassMap.RegisterClassMap
(); BsonClassMap.RegisterClassMap (); -
动态方式 – 在编译时未知类型:
BsonClassMap.LookupClassMap(typeof(PlotNode)); BsonClassMap.LookupClassMap(typeof(EndNode));
-
另一个建议 – 使用LINQ而不是Query
Node node = collection.AsQueryable().FirstOrDefault(n => n.Id == id);
- 如何将位图像素复制到其他位图,保留C#中的alpha透明度?
- 增加图像的分辨率(dpi)
- 如何从.cs文件asp.net调用HttpHandler
- 你如何处理本地化/ CultureInfo
- 如何使用数据目录在Visual Studio 2010中创建安装文件期间附加SQL Server数据库文件(.mdf)
- 使用C#的Windows凭据提供程序
- 在C#中将dd-mm-yyyy转换为mm / dd / yyyyy
- 将按钮添加到Winforms DataGridView
- Nlog给出exception可能的解释是缺少零arg和单个arg Common.Logging.Configuration.NameValueCollection构造函数