参考:
https://developers.google.com/protocol-buffers/
https://developers.google.com/protocol-buffers/docs/encoding属性标记
protobuf的属性的三个标识required,序列化的内容里必须有这个属性键对key-value pair
optional,序列化的内容里有0个或1个属性键对
repeated,序列化的内容里有0个或多个属性键对
当保存Varint类型时,每个字节的最高位(1:有;0:无)表示后面是否还有字节传过来,低7位存储数值的补码,
一般来说在计算机保存int都是4个byte,当protobuf序列化int的话,数值越小,则占用的字节越小,那么序列化后的二进制也就是越小,
除非是非常大的数在Varint中会占5个字节,
一般来说,除非是非常大的数,否则protobuf序列化int后占用的字节比一般int占用的字节少。
序列化
getSerializedSize()计算对象的数据大小,
如果接收端无法识别field key,则会跳过该key;
每个key会包含两部分
1.proto文件定义field key的序列field_number
2.key的wire_type
根据这两部分,可以知道field key对应的value值长度
每个key由以下计算得来(结果为varint类型):
(field_number << 3) | wire_type
则最后3位保存着wire_type的值
比如key序列化为0X08则
0000 1000
去掉最高标识位,剩下
_000 1000
最后3位为000,即是0,看下面的wire_type列表,知道是Varint,然后右移3位000 0001得到field_number为1,知道key在proto文件定义的序号是1
wire type 列表
------------------------------------------------------------------------------------
Type Meaning Used For
------------------------------------------------------------------------------------
0 Varint int32, int64, uint32, uint64, sint32, sint64, bool, enum
1 64-bit fixed64, sfixed64, double
2 Length-delimited string, bytes, embedded messages, packed repeated fields
3 Start group groups (deprecated)
4 End group groups (deprecated)
5 32-bit fixed32, sfixed32, float
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
wire_type:1
------------------------------------------------------------------------------------比如300,protobuf序列化:
1010 1100 0000 0010
每个byte去年最高位标识位,则每组byte各剩下低7位
_010 1100 _000 0010
pro