1. 使用Varint编码数据,越小的数据,用少的字节编码。如小于128的用一个字节编码,大于128的用多个字节编码。同时,每个字节最高为1或者0表示是否为数字的一部分。
2. 由于负数的补码表示很大,使用了ZigZag编码,转换成正数,使用Varint编码
3. 使用T-V,没有使用T-L-V, 即Tag- Length -Value,少了length字段
4. Tag表示,标识号 + wire。
// Tag 的具体表达式如下 Tag = (field_number << 3) | wire_type
enum WireType { WIRETYPE_VARINT = 0, WIRETYPE_FIXED64 = 1, WIRETYPE_LENGTH_DELIMITED = 2, WIRETYPE_START_GROUP = 3, WIRETYPE_END_GROUP = 4, WIRETYPE_FIXED32 = 5 };
pb整个序列化协议特别好,序列化后结构很紧凑。体积小,规则简单,序列化和反序列化效率高
参考:https://blog.csdn.net/carson_ho/article/details/70568606
这个博客写的非常好