所有
考虑这个例子:
private class CollectionHolder
{
public ObjectId Id { get; set; }
public MyCollection Collection { get; set; }
}
private class MyCollection : List<int>
{
public MyCollection(List<int> a)
{
this.AddRange(a);
}
}
private static void CollectionTest()
{
var collection = database.GetCollection<MyCollection>("collectionTest");
collection.RemoveAll();
collection.Save(new CollectionHolder { Collection = new MyCollection(new List<int> { 1, 2, 3, 4, 5 }) });
var x = collection.AsQueryable().First(); //exception!
x.ForEach(Console.WriteLine);
}
标记的行抛出异常
反序列化类MongoDriverTest.Program + CollectionHolder的Collection属性时发生错误:反序列化类MongoDriverTest.Program + MyCollection的Capacity属性时发生错误:对象引用未设置为对象的实例。
我不确定,这是10gen mongo驱动程序中的错误,还是不可能实现? 您如何看待,这应该作为错误发布?
此外 - 避免此类错误的最佳方法是什么?
答案 0 :(得分:4)
1.4.2及更早版本中自定义集合的问题在于,由于没有为自定义集合注册序列化程序,因此C#驱动程序尝试使用BsonClassMapSerializer对其进行序列化。但是BsonClassMapSerializer要求序列化的类将所有要序列化的数据公开为公共get / set属性(基类List&lt; T&gt;不是)。
1.5中唯一改变的是驱动程序在POCO实现IEnumerable或IDictionary时如何选择使用哪个序列化程序。
您可以使用1.4.2及更早版本中的自定义集合,为您的自定义集合显式注册序列化程序,如下所示:
BsonSerializer.RegisterSerializer(typeof(MyCollection), new EnumerableSerializer<int>());
答案 1 :(得分:2)
目前,不支持自定义集合。已经在master中实现,并且将在1.5版本中存在。在此之前,您无法使用自定义集合来获取您请求的行为。