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 驱动程序中的错误,还是无法实现?您如何看待,这应该作为错误发布吗?
此外,避免此类错误的最佳方法是什么?
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 版中存在。 在此之前,无法使用自定义集合来获取所请求的行为。