Protobuf 学习记录
支持多种语言,只需定义好数据结构,利用Protobuf框架生成源代码,就可很轻松地实现数据结构的序列化和反序列化。对于string,bytes和嵌套消息类型的数据,使用Length-delimited编码,也就是把value的length也编码进去。protobuf中消息的字段都是k-v类型的,每个字段进行编码后,再利用T-L-V或T-V的方式进行数据存储。对于大整数类型的数据,使用64-bit和
Protobuf 学习记录
1、Protobuf 是什么
Protobuf是一种灵活高效可序列化的数据协议,相于XML,具有更快、更简单、更轻量级等特性。支持多种语言,只需定义好数据结构,利用Protobuf框架生成源代码,就可很轻松地实现数据结构的序列化和反序列化。一旦需求有变,可以更新数据结构,而不会影响已部署程序。
2、特点
优点:
体积小、序列化速度快、传输速度快
使用简单:自动进行序列化和反序列化
维护成本低、扩展性好
加密性好:抓包只能看到字节
缺点:
自解释性差(可读性差):以二进制数据流方式存储,需要通过.proto文件才能了解到数据结构
3、message
field number
message 中每个field 都有一个唯一的number,用以在编码后识别自身,而且这个number 在message type 使用过程中不能修改。
field number 可以是1 ~ -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
更多推荐
所有评论(0)