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

本文关键字:接口 反序列化 成员 10gen mongo | 更新日期: 2023-09-27 18:35:56

All

请考虑以下示例:

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

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

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

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

1.5 中唯一更改的是驱动程序在 POCO 实现 IEnumerable 或 IDictionary 时如何选择要使用的序列化程序。

可以通过显式注册自定义集合的序列化程序来使用 1.4.2 及更早版本中已有的自定义集合,如下所示:

BsonSerializer.RegisterSerializer(typeof(MyCollection), new EnumerableSerializer<int>());

目前不支持自定义集合。 在 master 中已经实现了,并将在 1.5 版中存在。 在此之前,无法使用自定义集合来获取所请求的行为。