反序列化protobuf-net类List <t> Property / Member </t>

时间:2012-04-07 19:31:27

标签: c# protobuf-net

我正在写一些自然语言处理代码,并希望有一个二进制格式字典来查找单词含义。我最初使用标准的序列化和二进制格式化机制,但对结果文件的大小以及(冗余)类型信息的充满程度感到震惊。我一直试图让protobuf-net库为我工作,但有以下问题:

当我将字典写入文件时,我还将记录开始的偏移量放入索引文件中,我认为序列化工作正常,但是当我查看输入时,我得到正确的偏移量,但是DictionaryEntry的Definitions属性包含从那时起所有的DictionaryDefinitions(数以千计)。列表中的第一个DictionaryDefinition是搜索词的正确DictionaryDefinition。

我尝试将其作为Property和Public成员实现,但没有成功。我还在ProtoCameract属性中尝试了SkipConstructor = true,在ProtoMember属性中尝试了OverwriteList = true。

[ProtoContract] 
public class DictionaryEntry
{
    [ProtoMember(1)]
    public string EntryKey { get; set; }
    [ProtoMember(2)]
    public List<DictionaryDefinition> Definitions{ get; set; }
}

[ProtoContract]
public class DictionaryDefinition
{
    [ProtoMember(1)]
    public string PartOfSpeech { get; set; }
    [ProtoMember(2)]
    public string Definition { get; set; }
}

我不认为我在其余的代码中做过任何特别愚蠢的事情,但是如果有人可以为这部分提出任何建议,我想排除这一点。

谢谢,

中号

1 个答案:

答案 0 :(得分:2)

原始protobuf格式既没有长度前缀也没有终结符 - 它的设计使得append === merge。

如果需要识别单个流中的单个对象,请使用* WithLengthPrefix方法进行序列化/反序列化。这样您就可以从流中可靠地选择单个元素。