MongoDB C#Drivier - 反序列化HybridDictionary

时间:2015-08-10 14:58:26

标签: c# mongodb mongodb-.net-driver

我们目前正在寻求使用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

在深入了解序列化文档后,我们发现我们可以使用SubSections修饰[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]属性,所以现在我们有:

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检索文档时,返回的值只包含反序列化的基SectionSubSections属性只是一个空集合。

我想知道是否有人之前遇到过此问题,或者您是否有任何关于反序列化问题可能解决方案的建议。我们一直在使用的一个可能的解决方案是构建一个自定义序列化程序并将其注册到Mongo for HybridDictionary类型。但是,由于缓存项value只是一个普通的object,我们可能遇到无法序列化/反序列化的其他类型,因此可能需要构建一堆不同的序列化程序。

1 个答案:

答案 0 :(得分:1)

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

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