我正在写一些自然语言处理代码,并希望有一个二进制格式字典来查找单词含义。我最初使用标准的序列化和二进制格式化机制,但对结果文件的大小以及(冗余)类型信息的充满程度感到震惊。我一直试图让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; }
}
我不认为我在其余的代码中做过任何特别愚蠢的事情,但是如果有人可以为这部分提出任何建议,我想排除这一点。
谢谢,
中号
答案 0 :(得分:2)
原始protobuf格式既没有长度前缀也没有终结符 - 它的设计使得append === merge。
如果需要识别单个流中的单个对象,请使用* WithLengthPrefix方法进行序列化/反序列化。这样您就可以从流中可靠地选择单个元素。