C#10gen和mongo:将成员反序列化为接口

时间:2012-05-31 10:20:44

标签: c# mongodb 10gen-csharp-driver

所有

考虑这个例子:

    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驱动程序中的错误,还是不可能实现? 您如何看待,这应该作为错误发布?

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

2 个答案:

答案 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版本中存在。在此之前,您无法使用自定义集合来获取您请求的行为。