前提:
了解下Varint32 编码参考:https://blog.csdn.net/convict_eva/article/details/91484163
protobuf 是什么:
google 提供一个高效的序列化工具
优点:
对比json 和 xml 更加节省空间,序列化反序列化效率更高。适合对数据大小和传输速率比较敏感的场合使用。
像后兼容(field 标识不能被修改)
缺点:
序列化后为二进制数据,可读性不高,不能简单的分析有效性
目前使用不广泛,只支持java,C++和Python
序列化过程:
经过protobuf 序列化后,数据是一个键值对二进制流。如下图:
K |
V |
K |
V |
K |
V |
... |
每一个 k-v 对应一个 field。
protobuf 除了string 和 byte 数组,已经规定了数据类型的长度,所以如果是这两种数据类型就需要在k-v 之间多varint32类型的数字,表示v的长度。 上图变型如下:
K |
Varint32 |
V |
K |
V |
K |
V |
... |
只有第一个field 需要标识数据长度。
一个field 只有 K-[Varint32]-V 组成,那么就存在有两个问题:
1、反序列化可以对应到具体的属性
2、这个 Varint32值 怎么知道什么时候有,什么时间没有。
protobuf 通过对Key 解决了上面两个问题:
protobuf 每一个属性都有唯一一个 tag(数字)标识,不同数据类型传输类型(见下表)也不同。
Key 的序列化公式: tag <<< 3 | writeType
说明:tag 无符号左移三位,使用后三位表示传输类型。
如:tag 为5,数据类型为int32,key值为 00101000 后三位表示传输类型&#