Protobuf 学习记录

1、Protobuf 是什么

Protobuf是一种灵活高效可序列化的数据协议,相于XML,具有更快、更简单、更轻量级等特性。支持多种语言,只需定义好数据结构,利用Protobuf框架生成源代码,就可很轻松地实现数据结构的序列化和反序列化。一旦需求有变,可以更新数据结构,而不会影响已部署程序。

2、特点

优点:

体积小、序列化速度快、传输速度快

使用简单:自动进行序列化和反序列化

维护成本低、扩展性好

加密性好:抓包只能看到字节

缺点:

自解释性差(可读性差):以二进制数据流方式存储,需要通过.proto文件才能了解到数据结构

3、message

field number

message 中每个field 都有一个唯一的number,用以在编码后识别自身,而且这个number 在message type 使用过程中不能修改。

field number 可以是1 ~ 2^{29}-1,预留三位给wire type

field rules
  • required: 编码好的消息中必须有一个这样的field;
  • optional: 编码好的消息中可以有0 或 1 个这样的field;
  • repeated:这个修饰的field 可以重复多次(包括 0 次),重复的value 顺序需要维护;

4、编码和存储方式

消息结构

protobuf中消息的字段都是k-v类型的,每个字段进行编码后,再利用T-L-V或T-V的方式进行数据存储。

T作为标识表明了在消息中的位置和数据类型,V表示实际的值。

其中,Tag由字段编号field_number和编码类型wire_type组成。最后三位存wire_type(编码类型),其他位存field_number(字段编号)

wire_type编码有以下几种类型:

在这里插入图片描述

编码方式和存储方式(参考链接
wire_type = 0 时

对于int32/int64类型的数据,使用Varints编码,存储格式为T-V。对于sint32/sint64类型的数据,先用ZigZag编码,再用Varints编码。

wire_type = 2时

对于string,bytes和嵌套消息类型的数据,使用Length-delimited编码,也就是把value的length也编码进去。存储格式为T-L-V。

wire_type = 1或5时

对于大整数类型的数据,使用64-bit和32-bit编码方式(固定长度的编码类型),存储格式为T-V

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐