【问题标题】:Mongodb - entity serialized OK, but gives 'No serializer found for type' error when deserializingMongodb - 实体序列化OK,但在反序列化时给出'No serializer found for type'错误
【发布时间】:2012-09-11 19:47:08
【问题描述】:

我在使用 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 规则。我希望我不需要为此创建自定义序列化程序......据我所知,我没有做任何我以前没有做过的事情,除了文档嵌套了两层深。它在创建文档时一点问题都没有,只是当我尝试将其恢复时,我遇到了问题。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# mongodb serialization deserialization


    【解决方案1】:

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

    又看了一遍mongodb文档,发现注册类的同时可以注册类的属性。

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

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

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

    MongoDB 现在能够反序列化这些对象并对其进行序列化。

    【讨论】:

    • 没有与此相关的其他回复,因此已将其标记为正确
    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2013-05-13
    • 2019-04-09
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    相关资源
    最近更新 更多