减少 Protocol Buffers 消息大小的选项

Options for reducing Protocol Buffers's Message size

我想将对象序列化为数据,并尽可能减小序列化数据的大小,目前我正在测试 Protocol Buffers。

我已经阅读了 official encoding doc,并且对 varint 数字做了一些优化,除此之外,我还可以做任何其他优化来减少消息大小吗?

这里有一些建议,假设您使用的是 proto3 格式。

太多的大小优化可能不值得-这些都会影响生成的代码and/or需要提前知道字段值的范围/分布。

  • 尽可能使用最小的数据类型
    • 避免writing negative integers as int32/int64,如果字段经常为负数,编码为sint32/sint64
    • 尽可能避免固定长度字段(fixed64sfixed64doublefixed32sfixed32float)。
    • 对于 varint 编码类型(int32int64uint32uint64sint32sint64bool, enum),默认值(0 或 false)将从序列化数据中省略 - 如果可能,使用它来表示 null/missing 值。
    • 如果 bool 字段大部分是 true,请反转字段的含义以在更多情况下使用默认值。
  • 最小化 size/number 嵌入式消息
    • 尽可能避免嵌套消息(例如,Int32Value 之类的“包装”类型用于可空字段)- 这些需要额外的 embedded message 以及数据。
    • 字段标签编号 written alongside datavarint - 标签 1-15 占用一个字节,16-2047 占用 2 个字节。因此,为常用字段保留标签 1-15,并给 optional/rarely 使用的字段更高的标签编号。
    • 要可视化您的消息有多少标签嵌套,请将序列化数据通过管道传输到 protoc --decode_raw
  • 如果可以,请在序列化后压缩消息