MongoDB c#驱动程序-反序列化HybridDictionary
本文关键字:反序列化 HybridDictionary 驱动程序 MongoDB | 更新日期: 2023-09-27 18:07:08
我们目前正在寻求实现一种使用MongoDB作为存储库的持久缓存。我们正在使用一个遗留代码库,其中包含使用HybridDictionary的类,这是一个。net专用集合。
我们使用的样例类结构如下:public class Section
{
HybridDictionary _SubSections = new HybridDictionary(true);
public Guid SectionID {get; set;}
public string Name {get; set;}
public HybridDictionary SubSections {get { return this._SubSections; }}
}
在本例中,SubSections
属性包含额外的Section
类型项。首先是家长,然后是孩子。它的子元素可以附加子元素,等等。
当我们使用Mongo驱动程序查找修改这些文档之一时,我们正在运行一个期望MongoCacheItem
的查询。MongoCacheItem
包含一个Object
属性,在本例中,它是Section
类型。
public class MongoCacheItem
{
[BsonId]
public string Key { get; set; }
public object Value { get; set; } // This is a `Section`
}
CacheContext.Cache.FindAndModify(new FindAndModifyArgs
{
Query = Query<MongoCacheItem>.EQ(x => x.Key, key),
Update = Update.Replace(cacheItem),
Upsert = true
});
当我们运行上面的逻辑时,第一个Section
被正确序列化。所以我们在Mongo中得到一个包含属性sectionid
和name
的文档,但没有SubSections
。
[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
来修饰SubSections
属性,所以现在我们有:
public class Section
{
HybridDictionary _SubSections = new HybridDictionary(true);
public Guid SectionID {get; set;}
public string Name {get; set;}
[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
public HybridDictionary SubSections {get { return this._SubSections; }}
}
再次运行FindAndModfiy,我们现在得到一个文档,其中包含完全序列化的对象,并将SubSections
序列化为具有所有子节点的文档数组。
然而,当我们使用FindOne从Mongo检索文档时,返回的值只有基本的Section
反序列化。SubSections
属性只是一个空集合。
我想知道是否有人以前遇到过这个问题,或者您是否有任何解决反序列化问题的建议。我们一直在考虑的一个可能的解决方案是构建一个自定义序列化器,并在Mongo中为HybridDictionary类型注册它。然而,由于缓存项value
只是一个普通的旧object
,我们可能会遇到无法序列化/反序列化的其他类型,因此可能需要构建一堆不同的序列化器。
MongoDB驱动程序至少需要一个私有集用于属性
[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
public HybridDictionary SubSections
{
get { return this._SubSections; }
private set { this._SubSections = value; }
}