前言
在网络传输中,经常有大端小端的区别,并且与我们编写的程序交互的,不一定也是C/C++,例如安卓,所以我们需要一个协议,能够进行数据的传输。大部分人最常用的,可能是json了,今天我们介绍另外一个工具,protobuf,这是一个google的开源项目。支持c++,java,python等多种语言。
下载与安装
github代码地址
进入代码目录:
./configure --prefix=/usr/local/protobuf
sudo make
sudo make install
如果是ubuntu或者centos的,也可以使用yum或者apt-get安装
使用
使用protobuf需要我们定义一个proto文件,用来定义protobuf消息。
Protobuf消息定义
消息由至少一个字段组合而成,类似于C语言中的结构。每个字段都有一定的格式。
字段格式:限定修饰符 | 数据类型 | 字段名称 | = | 字段编码值 | [字段默认值]
- 限定修饰符:
- required 表示这个字段必填
- optional 可选
- repeated 可重复,我们可以理解为Array,并且可以为空
-
数据类型:
- 字段名称:protobuf建议以下划线命名而非驼峰式。例如app_name优于appName。(作为一个java程序员,我还是改不了驼峰呀T T)
- 字段编码值:使用protobuf转化的byte中并没有带字段名称,而是一个字段编码,字段编码是一个正32位整数,通常来说,越小效率越高。
- 默认值这个没啥好解释的。
当然,protobuf还支持Import/enum/package等关键字
实践:
接下来需要跟客户端进行交互,我们新建一个touch_message.proto的文件,定义TouchMesssage理解为一个心跳的data。
![](https://img.haomeiwen.com/i2532461/3262cf466a1bef0e.png)
然后执行命令
![](https://img.haomeiwen.com/i2532461/d63dbe5fcf1e44bd.png)
我们就能看到生成的对应的.h跟.cpp文件了。
![](https://img.haomeiwen.com/i2532461/969a5f4ea264b24a.png)
我们发现其实是生成一个类,类中有着对应的方法。
![](https://img.haomeiwen.com/i2532461/ee3692fd87909315.png)
我们在另外一个文件中编写一个test的类。我们可以用get/set方法。SerializeToArray是序列化,ParsFromArray是反序列化。
然后我们就可以编译运行了,编译的时候需要引入对应的.h文件
![](https://img.haomeiwen.com/i2532461/75ed7bf82bd3721f.png)
需要把对应的参数替换成你安装的位置即可。
![](https://img.haomeiwen.com/i2532461/a8bf8d1cf19fc160.png)
运行结果,达成预期,并且size会比我们使用json更小。别小看小了这么一点点。当你系统的量上来后,作用还是很大的。
网友评论