從第一次接觸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