浅析Protobuf数据格式

浅析Protobuf数据格式





Protobuf是Google开源的一款类似于Json,XML数据交换格式,其内部数据是纯二进制格式,不依赖于语言和平台,具有简单,数据

量小,快速等优点. 目前用于序列化于反序列化官方支持的语言有C++,C#,JAVA,PYTHON. 适用于大小在1M以内的数据,因为像

在移动设备平台,内存是非常珍贵的.

使用的方法也比较简单:

1.定义用于消息文件.proto

2.使用protobuf的编译器编译消息文件

3.使用编译好对应语言的类文件进行消息的序列化于反序列化


Protobuf消息定义


消息由至少一个字段组合而成,类似于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++语言中的逗号(,)

发布了182 篇原创文章 · 获赞 466 · 访问量 25万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览