配图清新的Protobuf 编码&避坑指南

💡 原文中文,约5300字,阅读约需13分钟。
📝

内容提要

本文介绍了Protocol Buffers(protobuf)的特点、编码原理和最佳实践,包括高效、跨语言支持、清晰的结构定义和向后兼容性等优点。同时也提到了一些缺点,如不直观、缺乏一些数据类型和需要额外的编译步骤。编码原理方面,详细介绍了message的结构、tag的编码、Varints编码、ZigZag编码以及embedded messages和repeated类型的编码。最后,给出了一些最佳实践,如字段编号的选择、保留字段的使用、不修改字段tag编号和字段类型、不使用required关键字等。

🎯

关键要点

  • Protocol Buffers(protobuf)是Google开发的数据序列化协议,具有高效、跨语言支持、清晰结构定义和向后兼容性等优点。
  • protobuf的缺点包括不直观、缺乏某些数据类型和需要额外的编译步骤。
  • protobuf的编码原理包括message结构、tag编码、Varints编码、ZigZag编码以及embedded messages和repeated类型的编码。
  • message是由键值对组成,tag保存字段编号和类型信息,protobuf序列化不带字段名。
  • Varints编码通过去除无效的0来压缩数字类型的存储,适用于小于127的数字。
  • ZigZag编码用于负数,将负数映射为无符号整数以节省存储空间。
  • embedded messages和repeated类型的编码方式与基本类型相似,但需要计算大小。
  • 最佳实践包括选择合适的字段编号、使用保留字段、避免修改字段tag编号和类型、以及不使用required关键字。
  • 尽量使用小整数以提高Varints编码的压缩效果,负数可以使用sint32或sint64来节省空间。
➡️

继续阅读