Protocol Buffer是Google的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。基于它,可以实现数据的序列化和反序列化,对序列化后的数据进行加解密或者传输。相比xml/json,更容易理解和维护。
Google开源了PB,开发者可以到github相应库上查询下载。要使用PB,需要编译器将特定协议文件转换成对应的语言代码。到https://github.com/google/protobuf/releases下载windows下的编译器压缩包protoc-x.x.x-win32.zip,解压之后就可以直接使用了。假设解压在D:\ 盘,解压之后得到protocolBuffer文件夹,底下还有bin\,include\文件夹,和readme.txt。bin\文件夹内的protoc.exe即是protocolBuffer编译器可执行文件。可以将bin\目录加入到环境变量Path中,这样就可以直接在CMD中使用protoc命令。
有了编译器只是第一步,想要在具体项目使用PB还需要加入对应语言的库支持,这样通过协议文件生成的代码才能被序列化和反系列化。现在PB已经支持多种语言,有cpp、C#、java、js、object-C、php、python、ruby等。
Java的库生成需要maven,安装前先正确配置maven。到https://github.com/google/protobuf/releases下载对应项目protoc-java-x.x.x.zip,解压。把上述的protoc.exe文件拷贝到解压后src文件夹下,然后到解压后的java文件夹下,打开命令行,输入命令:
mvn package
前期配置都成功下,则会在java/core/targert目录下生成protobuf-java-x.x.x.jar库。将该jar包加入到java项目即可使用PB了。
python的安装比较简单,到https://github.com/google/protobuf/releases下载protoc-python-x.x.x.zip,解压。进入解压后的python文件夹下,打开命令行,按序输入:
python setup.py build
pythob setup.py test
python setup.pv install
一般情况下,PB的python库已加入了python的运行环境中了。
现在已经有了java和python的库,但如果每个协议文件要编译都要敲两次不同语言的编译命令则觉得有点繁琐,所以可以引入dat批处理文件脚本来编译。在编译器protoc.exe所在目录下新建build\java\、build\python\、src\目录,并创建文件customBuild.dat文件,文件内容如下:
@echo off
::清空java
rd /q /s build\java
mkdir build\java
:: 清空python
rd /q /s build\python
mkdir build\python
::build
for /r "src" %%i in (*.proto) do (
echo build %%i
protoc -I src --java_out=build\java %%~nxi
protoc -I src --python_out=build\python %%~nxi
)
pause
这样只要将要编译的协议文件放入src\中,然后运行customBuild.dat即可在相应目录下生成代码文件。
假设我们有一些用户信息需要通过C/S通信来获取,编写user.proto文件:
syntax = "proto3";
// 姓名
message info {
int32 age = 1;
string surname = 2;
string name = 3;
}
// 地址
message address {
string province = 1;
string city = 2;
string downtown = 3;
}
// 联系方式
message contact {
repeated string phone = 1;
string email = 2;
}
message user {
info userInfo = 1;
address userAddress = 2;
contact userContact = 3;
}
并将其放入src\中,执行customBuild.dat。
生成了User.java和user_pb2.py。
生成的代码太多就不贴了,有空整理下protoc的命令和数据类型。