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

本文关键字:Property Member protobuf-net List 反序列化 | 更新日期: 2023-09-27 18:30:17

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

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

我尝试将其作为财产和公共成员实施,但没有成功。我还在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; }
}

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

谢谢

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

原始 protobuf 格式既没有长度前缀也没有终止符 - 它的设计使得附加 === 合并。

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