【问题标题】:Is it possible to serialize an array of ConcurrentDictionary using protobuf-net?是否可以使用 protobuf-net 序列化 ConcurrentDictionary 数组?
【发布时间】:2014-04-28 04:42:15
【问题描述】:

是否可以使用 protobuf-net 序列化以下类?我翻遍了,找不到任何此类场景的示例?

  [ProtoContract]
  public class Example
  {
    [ProtoMember(1)]
    public ConcurrentDictionary<int, string> CategoryNames;
    [ProtoMember(2)]
    public ConcurrentDictionary<int, int[]> TaxonomyMap;
    [ProtoMember(3)]
    public ConcurrentDictionary<int, Dictionary<int, int>>[] Tokens;  
  }

我目前得到标准的“不支持嵌套或锯齿状列表和数组”。但是,我不确定如何映射这样的类?

编辑: 根据@Marc 下面的建议,我能够成功地使用 protobuf-net 序列化上面的类。为了完整起见,我在下面添加了我的解决方案:

创建了以下包含 ModelPartition 对象列表的类:

[ProtoContract]
public class GenomeModel
{
    [ProtoMember(1)]
    public ConcurrentDictionary<int, string> categoryNames = 
        new ConcurrentDictionary<int, string>();
    [ProtoMember(2)]
    public ConcurrentDictionary<int, int[]> taxonomyMap = 
        new ConcurrentDictionary<int, int[]>();
    [ProtoMember(3)]
    public List<ModelPartition> geneTokens = new List<ModelPartition>();
}

ModelPartition 对象用于通过将每个索引位置和单个 ConcurrentDictionary 成员保存在单独的 ModelPartition 对象中“抽象掉” ConcurrentDictionary 数组,然后将其放置在 GenomeModel.geneTokens ModelPartition 列表中:

[ProtoContract]
public class ModelPartition
{
    [ProtoMember(1)]
    public int partitionNo;
    [ProtoMember(2)]
    public ConcurrentDictionary<int, Dictionary<int, int>> partitionData;

    public ModelPartition(int PartitionNo
               , ConcurrentDictionary<int, Dictionary<int, int>> PartitionData)
    { 
        partitionNo = PartitionNo;
        partitionData = PartitionData;
    }
}

最后,在序列化过程中,使用 ModelPartition 作为包装对象,使用短转换将数据从原始“Example”对象加载到 GenomeModel 对象中:

GenomeModel genomeModel = new GenomeModel();
genomeModel.categoryNames = strand.categoryNames;
genomeModel.taxonomyMap = strand.taxonomyMap;

for (int i = 0; i < strand.minhashSignatureSize; i++)
{
    genomeModel.geneTokens.Add(new ModelPartition(i, strand.geneTokens[i]));
}

using (var file = File.Create(commandAgrs[0]))
{
    Serializer.Serialize<GenomeModel>(file, genomeModel);
}

谢谢马克!

【问题讨论】:

    标签: protobuf-net concurrentdictionary


    【解决方案1】:

    ConcurrentDictionary&lt;TKey,TValue&gt; 工作正常。问题是ConcurrentDictionary&lt;TKey,TValue&gt;[] - 本质上(从库的角度来看)与KeyValuePair&lt;TKey, TValue&gt;[][] 相同的布局 - 即嵌套数组。如果您需要,请考虑拥有一个数组(或列表),每个 拥有 一个字典,而不是字典数组。

    【讨论】:

    • 谢谢马克,为了完整起见,我在上面添加了一个工作示例。我真的很喜欢 protobuf-net。在过去的几年里,我已经多次使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多