从第一次接触Protobuf到实际使用已经有半年多,刚开始可能被它的名字所唬住,其实就它是一种轻便高效的数据格式,平台无关、语言无关、可扩展,可用于通信协议和数据存储等领域。html
安装依赖的库: autoconf automake libtool curl make g++ unzipjava
安装:linux
1 $ ./autogen.sh 2 $ ./configure 3 $ make 4 $ make check 5 $ sudo make install
下载相应版本jar包便可。(csdn上上传了nano版本的jar包和exe文件)git
首先举一个服务端和客户端按照Protobuf协议进行数据数据传输的例子,工做流程以下图:(图下方深色部分为服务端部分,上方浅色部分为客户端部分)github
一、服务端和客户端约定他们使用PB协议做为数据传输和存储的工具,并约定传输信息的字段,以下:里面定义支付传输的字段。windows
1 syntax = "proto2"; // PB协议版本 2 import "Common.proto"; // 引入Common.proto,位于Protobuf sdk中 3 4 option optimize_for = LITE_RUNTIME; 5 6 option java_package = "com.xxxx.entity.pb"; // 生成类的包名 7 option java_outer_classname = "PayInfo"; // 生成类的类名 8 9 message PayInfo{ 10 required string payid = 1; // 支付相关的字段信息 11 optional string goodinfo = 2; // optional 为可选参数 12 required string prepayid = 3; // required为必填参数 13 optional string mode = 4; 14 optional int userid = 5; 15 repeated string extra = 6; // repeated 为数组 16 }
二、经过Protobuf源码编译获得可运行程序(也能够在网上查找下载,注意PB协议的版本)。获得exe程序中,在windows环境下经过命令行窗口命令生成上述文件中定义的PayInfo.java文件。(protoc 为可执行的exe文件)后端
1 protoc --java_out ./ ./PayInfo.proto
三、将生成PayInfo文件集成到项目代码中,同时须要引入 ProtoBuf的sdk(由于生成的PayInfo.Java类中引入了sdk中的类),能够在github上下载:https://github.com/google/protobuf。数组
四、服务端经过支付信息初始化PayInfo类,并调用ProtoBufSDK中 com.google.protobuf.nano 类的 toByteArray()方法将PayInfo转化为字节数组,经过网络传输给客户端(能够进行加密和压缩操做,注意顺序)。服务器
1 public static final byte[] toByteArray(MessageNano msg) { 2 byte[] result = new byte[msg.getSerializedSize()]; 3 toByteArray(msg, result, 0, result.length); 4 return result; 5 }
五、客户端拿到字节数据后,经过集成的PayInfo.java文件对字节数据解析成PayInfo对象(经过程序生成的java文件都会自动生成这个函数)。微信
1 public static PayInfo parseFrom(byte[] data)
自此:客户端就顺利拿到了服务端发送的支付信息,能够经过他们调起支付宝或者微信客户端发起支付了。
由此能够看出ProtoBuf只是一种协议,一种存储数据的格式,对应上面生成的字节数据的格式,任何语言的程序均可以经过本地类和jar包将字节数据解析成对象(语言/平台无关)。
使用建议:
一、经过编译程序生成.java文件有不一样的版本,建议使用nano版本(3.0以后的PB协议才发布该版本),这种版本生成的java文件方法数较少(没有set,get等函数),对APK的体积影响更小(四五个文件大先后相差80~90Kb,项目中后续做了替换)。命令:
1 protoc_3.1.0.exe --javanano_out ./ ./GetConfig.proto
二、无论用2.0仍是3.0仍是nano版本仍是非精简版最终生成的字节数据文件是相同的,不影响先后端的交互。
Protobuf 有如 XML,不过它更小、更快、也更简单。你能够定义本身的数据结构,而后使用代码生成器生成的代码来读写这个数据结构。Protobuf 语义更清晰,无需相似 XML 解析器的东西(由于 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操做)。
和其它数据协议的比较以下图:
做为开发者使用protobuf简单高效,至于里面具体如何实现深层次的东西咱们还不如花点时间学一下数据结构。
参考:
https://developers.google.com/protocol-buffers/
https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
https://tech.meituan.com/serialization_vs_deserialization.html