Mongodb - 实体序列化OK,但在反序列化时给出“找不到类型的序列化程序”错误

时间:2012-09-11 19:47:08

标签: c# mongodb serialization deserialization

我使用mongodb(v1.5)的c#驱动程序来解决这个问题

在序列化对象时,我遇到了类似的问题,但是在应用程序启动期间通过使用mongodb注册实体,过去总是能够解决这个问题。它反序列化问题的文档嵌套了两层(即嵌入文档中的文档中嵌入的文档)。

这些课程如下:

[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规则。我希望我不需要为此创建一个自定义序列化程序...据我所知,我没有做任何我以前没有做过的事情,除此之外,文档嵌套两层深。它正在创建文档没有任何问题,只是当我试图让它恢复时我有问题。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

好的,我现在已经成功解决了这个问题。

再看一下mongodb文档后​​,我发现你可以在注册课程时注册课程的属性。

所以现在我的注册看起来像这样:

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

(请注意,我的属性已从数组更改为List,但这不应该对我在这里讨论的问题产生任何影响)

MongoDB现在能够反序列化这些对象并将它们序列化。