Protobuf是Google开源的一款类似于Json,XML数据交换格式,其内部数据是纯二进制格式,不依赖于语言和平台,具有简单,数据
量小,快速等优点. 目前用于序列化于反序列化官方支持的语言有C++,C#,JAVA,PYTHON. 适用于大小在1M以内的数据,因为像
在移动设备平台,内存是非常珍贵的.
使用的方法也比较简单:
1.定义用于消息文件.proto
2.使用protobuf的编译器编译消息文件
3.使用编译好对应语言的类文件进行消息的序列化于反序列化
消息由至少一个字段组合而成,类似于C语言中的结构,每个字段都有一定的格式.
字段格式:限定修饰符 | 数据类型 | 字段名称 = | 字段编码值 | [字段默认值]
1.限定修饰符包括 required\optional\repeated
Required:表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段
的意思.发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃.
Optional:表示是一个可选字段,可选对于发送方,在发送消息时可以有选择性的设置或者不设置该字段的值. 对于接收方,如
果能够识别可选字段就进行相应处理,如果无法识别,则忽略该字段,消息中的其他字段正常处理. --因为optional字段的特性
,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常通信,只不
过不能享受补丁内容罢了.
Repeated:表示该字段可以包含0~N个元素. 其特性和optional一样,但是每一次可以包含多个值. 可以看作是在传递一个数组的值.
2.数据类型
Protobuf定义了一套基本数据类型,几乎都可以映射到C++/JAVA等语言的剧本
3.字段名称
字段名称的命名与C/C++,java等语言的变量命名方式几乎相同的.
protobuf建议字段的命名采用以下划线分割的驼峰式first_name, 而不是firstName.
4.字段编码值
有了该值,通信商法才能相互识别对方的字段,当然相同的编码值,其限定修饰符和数据类型必须相同.
编码值的取值范围为1~2^32,其中1~15的编码时间和空间效率都是最高的,编码值越大,其编码的时间和空间效率就越低,当然
一般情况下相邻的2个值编码效率是相同的,除非两个值恰好是在4字节,12字节的临界区,比如15和16.
5.默认值
当在传输数据的时候,对于required数据类型,如果用户没有设置值,则使用默认值传递到对端. 当接收数据是对于optional字
段,如果没有接收到optional字段,则设置为默认值.
关于import protobuf接口文件可以像C语言的h文件一个,分离为多个,再需要的时候通过import导入需要对文件. 其行为和C语
言的#include大致相同.
关于package
避免名称冲突,可以给每一个文件指定一个package名称,对于C++则解析为名称空间.
关于message
支持嵌套消息,消息可以包含另一个消息作为其字段,也可以在消息内定义一个新的消息.
关于enum
枚举的定义和C++相同,但是有一些限制. 枚举值必须大于等于0的整数. 使用分号(;)分隔枚举变量而不是C++语言中的逗号(,)