2

mongodb(v1.5)用のc#ドライバーを使用してこの問題が発生しています

オブジェクトをシリアル化するときにこれと同様の問題が発生しましたが、アプリケーションの起動時にエンティティをmongodbに登録することで、これまで常に解決できました。デシリアライズで問題が発生しているドキュメントは、2レベルの深さでネストされます(つまり、ドキュメント内に埋め込まれたドキュメント内に埋め込まれたドキュメント)。

クラスは次のようになります。

[BsonIgnoreExtraElements]
public class FooItem : IFooItem
{
    [BsonId]
    public ObjectId Id { get; set; }
    public IFooAccessRestrictions AccessRestrictions { get; set; }
}

public class FooAccessRestrictions : IFooAccessRestrictions
{
    [BsonId]
    public ObjectId Id { get; set; }
    public IAccessPermission[] AccessList { get; set; }
}

public class AccessPermission : IAccessPermission
{
    [BsonId]
    public ObjectId Id { get; set; }
    public DateTimeOffset CreatedOn { get; set; }
    public ObjectId CreatedBy { get; set; }
    public AccessPermissionType Type { get; set; }
    public string PermittedIdentity { get; set; }

    public AccessPermission()
    {

    }

    public AccessPermission(ObjectId createdBy, AccessPermissionType type, string permittedIdentity)
    {
        CreatedOn = DateTime.Now;
        CreatedBy = createdBy;
        Type = type;
        PermittedIdentity = permittedIdentity;
    }
}

「タイプのシリアライザーが見つかりません」という問題があるのはAccessPermissionクラスです。アプリケーションの開始時に、次のようにエンティティをmongodbに登録しようとしました。

        BsonClassMap.RegisterClassMap<FooAccessRestrictions>();
        BsonClassMap.RegisterClassMap<AccessPermission>(); 

私はここで私が気付いていないいくつかのmongodbルールを破っているに違いないと思います。このためにカスタムシリアライザーを作成する必要がないことを願っています...ドキュメントが2レベルの深さでネストされていることを除けば、これまでに行ったことのないことは何もしていません。そして、それはまったく問題なくドキュメントを作成している、それは私が問題を抱えているのは私がそれを取り戻そうとしたときだけである。

どんな助けでも大歓迎です。

4

1 に答える 1

1

さて、私は今これを修正することができました。

mongodbのドキュメントをもう一度見てみると、クラスの登録中にクラスのプロパティを登録できることがわかりました。

だから今私の登録は次のようになります:

        BsonClassMap.RegisterClassMap<FooAccessRestrictions>(cm =>
        {
            cm.MapProperty<List<IAccessPermission>>(c => (List<IAccessPermission>)c.AccessList);
        });

(私のプロパティが配列からリストに変更されたことに注意してください。ただし、これは、ここで話している問題に影響を与えるべきではありません)

MongoDBは、これらのオブジェクトをシリアル化するだけでなく、逆シリアル化できるようになりました。

于 2012-09-12T08:23:42.460 に答える