我使用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规则。我希望我不需要为此创建一个自定义序列化程序...据我所知,我没有做任何我以前没有做过的事情,除此之外,文档嵌套两层深。它正在创建文档没有任何问题,只是当我试图让它恢复时我有问题。
非常感谢任何帮助。
答案 0 :(得分:1)
好的,我现在已经成功解决了这个问题。
再看一下mongodb文档后,我发现你可以在注册课程时注册课程的属性。
所以现在我的注册看起来像这样:
BsonClassMap.RegisterClassMap<FooAccessRestrictions>(cm =>
{
cm.MapProperty<List<IAccessPermission>>(c => (List<IAccessPermission>)c.AccessList);
});
(请注意,我的属性已从数组更改为List,但这不应该对我在这里讨论的问题产生任何影响)
MongoDB现在能够反序列化这些对象并将它们序列化。