如何使用mongo C#驱动程序反序列化派生类数组的特定属性。无法创建抽象类的实例

时间:2016-07-07 21:33:01

标签: c# mongodb serialization

我使用的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注册类,并使用Namespace将标识符设置为Class Name。因此,当我创建ClassOfInterest的对象并且ElementArray是DerivedClass1元素类型的数组时,当我将其插入到DB中时,数组元素具有" _t" as" DerivedClass1"。关于Polymorphic classes and Discriminators的文档,所有看起来都很好。

出于某种原因,我决定只反序列化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();

但是,这次我收到错误&#34;无法创建抽象类的实例&#34;

这次出了什么问题?如果我要求整个ElementArray,它会将Element Array中的Elements正确反序列化为DerivedClass1。但是,当我要求特定属性(属于基类)时,我得到错误。

1 个答案:

答案 0 :(得分:1)

我没有要求鉴别器,因此解串器不知道如何处理它并试图创建抽象类的对象。 而不是只做

_fb.Include("ElementArray.BCProp")

我做了

_fb.Include("ElementArray.BCProp"); 
_fb.Include("ElementArray._t");

现在有效。