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 の Capacity プロパティの逆シリアル化中にエラーが発生しました: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

よくわかりませんが、これは 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

現在、カスタム コレクションはサポートされていません。マスターにはすでに実装されており、このためにリリース 1.5 に存在する予定です。それまでは、カスタム コレクションを使用して、要求している動作を取得することはできません。

于 2012-05-31T13:26:17.923 に答える