配图清新的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来节省空间。
➡️