0

全部

考虑这个例子:

    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 类的容量属性时出错:对象引用未设置为对象的实例。

我不确定,这是 10gen mongo 驱动程序中的错误,还是无法实现?你怎么看,这应该作为一个错误发布吗?

此外 - 避免此类错误的最佳方法是什么?

4

2 回答 2

4

1.4.2 和更早版本中自定义集合的问题在于,由于没有为您的自定义集合注册序列化程序,C# 驱动程序尝试使用 BsonClassMapSerializer 对其进行序列化。但是 BsonClassMapSerializer 要求被序列化的类将所有要序列化的数据公开为公共 get/set 属性(您的基类 List<T> 没有)。

1.5 中唯一改变的是当 POCO 实现 IEnumerable 或 IDictionary 时驱动程序如何选择使用哪个序列化程序。

您可以通过为您的自定义集合显式注册一个序列化程序来使用 1.4.2 和更早版本中已经存在的自定义集合,如下所示:

BsonSerializer.RegisterSerializer(typeof(MyCollection), new EnumerableSerializer<int>());
于 2012-06-04T14:40:13.323 回答
2

目前,不支持自定义集合。已经在 master 中实现,并将在 1.5 版中存在。在那之前,您不能使用自定义集合来获得您请求的行为。

于 2012-05-31T13:26:17.923 回答