如何使用 mongo C# 驱动程序反序列化派生类数组的特定属性.无法创建抽象类的实例
本文关键字:属性 实例 抽象类 创建 数组 mongo 何使用 驱动程序 反序列化 派生 | 更新日期: 2023-09-27 17:55:42
我使用的mongo C#驱动程序版本是1.1。我的代码结构如下所示。
public abstract Class BaseClass
{
public int BCProp {get; set;}
}
public class DerivedClass1 : BaseClass
{
public int DCProp1 {get; set;}
}
public class DerivedClass2 : BaseClass
{
public int DCProp2 {get; set;}
}
public class ClassOfInterest
{
public int Prop1 {get; set;}
// I want to bring back only certain values
// from the elements in this array while deserializing
public BaseClass[] ElementArray {get; set;}
}
在将文档插入MongoDB之前,我使用BsonClassMap注册类并将鉴别器设置为具有命名空间的类名。因此,当我创建一个 ClassOfInterest 的对象并且 ElementArray 是 DerivedClass1 元素类型的数组时,当我将其插入数据库时,数组元素的"_t"为"DerivedClass1"。根据有关多态类和鉴别器的文档,所有这些看起来都不错。
出于某种原因,我决定只反序列化 ClassOfInterest 的一些属性。我不想反序列化 Prop1,我只想要 ElementArray,所以我写了这样的代码
// Here I am specifying that I am interested only in ElementArray
// A Element in ElementArray will be of type DerivedClass1 and will
// include both BCProp and DCProp1
FieldsBuilder _fb = new FieldsBuilder();
_fb.Include("ElementArray");
List<string> IncludedFields = new List<string>();
var dic = _fb.ToBsonDocument().ToDictionary();
IncludedFields.AddRange(dic.Keys.ToList());
// I am querying DB
MongoCollection<ClassOfInterest> mcoll = ActiveDb.GetCollection<ClassOfInterest>(COICollName);
List<ClassOfInterest> COIObjects = mcoll.FindAll().SetFields(IncludedFields.ToArray()).ToList();
以上工作正常。返回的对象只有 ElementArray,不包括 Prop1。鉴别器工作,返回的对象在 ElementArray 中具有 DerivedClass1 类型的元素。
同样,出于某种原因,我不想从 DerivedClass1 中反序列化所有内容。所以我做下面的事情。
// Notice that I want to get back only BCProp in all ElementArray
FieldsBuilder _fb = new FieldsBuilder();
_fb.Include("ElementArray.BCProp");
List<string> IncludedFields = new List<string>();
var dic = _fb.ToBsonDocument().ToDictionary();
IncludedFields.AddRange(dic.Keys.ToList());
// I am querying DB
MongoCollection<ClassOfInterest> mcoll = ActiveDb.GetCollection<ClassOfInterest>(COICollName);
List<ClassOfInterest> COIObjects = mcoll.FindAll().SetFields(IncludedFields.ToArray()).ToList();
但是这次,我收到错误"无法创建抽象类的实例"
这次出了什么问题?如果我要求整个元素数组,它会正确地将元素数组中的元素反序列化为 DerivedClass1。但是,当我请求特定属性(属于基类)时,出现错误。
我没有要求鉴别器,所以反序列化器不知道如何处理它,并试图创建抽象类的对象。而不是只做
_fb.Include("ElementArray.BCProp")
我做了
_fb.Include("ElementArray.BCProp");
_fb.Include("ElementArray._t");
它现在有效。