protobuf--序列化原理

本文详细介绍了protobuf的序列化原理,包括protobuf的概念、优点、缺点,以及序列化过程中的关键点,如Varint32编码、字段标识和数据类型的处理。通过示例解析了protobuf消息的结构,并提供了源码分析和测试代码,帮助理解protobuf如何高效地进行数据序列化和反序列化。
摘要由CSDN通过智能技术生成

前提:

了解下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 后三位表示传输类型&#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值