MongoDB C# 驱动程序 - 反序列化 HybridDictionary

MongoDB C# Drivier - Deserializing HybridDictionary

我们目前正在寻找一种使用 MongoDB 作为存储库的持久缓存。我们正在使用遗留代码库,其中包含 class 使用 HybridDictionary 的 es,一个 .net 专门集合。

我们使用的 class 结构示例如下:

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 类型的项目。基本上一个parent,然后就是children。就是children可以追加children等

当我们使用 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,我们现在得到一个文档,其中包含完全序列化的 object,其中 SubSections 序列化为文档数组,所有 children.这按预期工作。

但是,当我们使用 FindOne 从 Mongo 中检索文档时,返回的值仅反序列化了基础 SectionSubSections 属性 只是一个空集合。

我想知道以前是否有人遇到过这个问题,或者您是否对反序列化问题的可能解决方案有任何建议。我们一直在尝试的一种可能的解决方案是构建一个自定义序列化程序并使用 Mongo 为 HybridDictionary 类型注册它。但是,由于缓存项 value 只是一个普通的旧 object,我们可以 运行 到不能 serialized/deserialized 的其他类型,因此可能需要构建一堆不同的序列化器。

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

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