Protobuf简介
Protobuf是谷歌开源的一个序列化框架,支持跨语言,高性能等特性,在用于网络传输进行序列化的场景下使用广泛。
它具有以下优点:
- 性能好,效率高
- 代码生成机制,数据解析类自动生成
- 支持向后兼容和向前兼容
- 支持多种编程语言(java,c++,python)
这里学习的基于proto3
版本,与proto2
有稍许区别。
Protobuf编译
学习Protobuf需要下载两个文件:
- protoc:用于将.proto反序列成对应的代码文件,这个可以直接从GitHub上下载。
- 类库:这里使用java类库,也可以从Github上下载,但是下载的是源码,需要编译。
下载地址
- protoc下载
- 类库下载
类库编译
本次编译是在Mac OS上进行的,在Windows上类似。
- 安装Maven,在Mac OS上直接使用
HomeBrew
进行安装,安装命令如下:
brew install maven
- 解压
protoc-3.5.1-osx-x86_64.zip
和protobuf-java-3.5.1.zip
压缩包,得到对应的文件目录; - 重要:将protoc文件拷贝到protobuf目录的src目录下。假设现在在
protoc-3.5.1-osx-x86_64
目录下,执行如下命令:
cp ./bin/protoc ../protobuf-3.5.1/src
- 进入
protobuf-3.5.1/java
目录下,执行命令
mvn install
mvn package
- 编译打包完成后,分别在
core/target
和util/target
目录下得到两个jar包。
开始使用
定义一个消息类型
先定义一个简单的消息类型,假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。可以采用如下的方式来定义消息类型的.proto文件了:
syntax = "proto3";
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
}
- 第一行通过定义
syntax
表明是使用的proto3语法,如果想使用proto2语法,就改成proto2
; - SearchRequest消息格式有3个字段,在消息中承载的数据分别对应于每一个字段。其中每个字段都有一个名字和一种类型。
指定字段类型
在上面的例子中,所有字段都是标量类型:两个整型(page_number和result_per_page),一个string类型(query)。当然,你也可以为字段指定其他的合成类型,包括枚举(enumerations)