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中得到一个包含属性sectionidname的文档,但没有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 c#驱动程序-反序列化HybridDictionary

MongoDB驱动程序至少需要一个私有集用于属性

[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
public HybridDictionary SubSections 
{ 
    get { return this._SubSections; } 
    private set { this._SubSections = value; } 
}