1

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

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

我曾尝试将其作为属性和公共成员来实现,但没有成功。我还尝试了 ProtoContract 属性中的 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; }
}

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

谢谢,

4

1 回答 1

2

原始 protobuf 格式既没有长度前缀也没有终止符 - 它被设计为 append === 合并。

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

于 2012-04-07T19:39:48.840 回答