序列化protobuf

参考:

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值