(一)ProtoBuf入門教程
在網路通訊和通用資料交換等應用場景中經常用的技術是JSON和XML,本教程介紹另外一個數據交換的協議工具ProtoBuf。
一、簡介
protocol buffers (ProtoBuf)是一種語言無關、平臺無關、可擴充套件的序列化結構資料的方法,它可用於(資料)通訊協議、資料儲存等。
Protocol Buffers 是一種靈活,高效,自動化機制的結構資料序列化方法-可類比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更為簡單。
json\xml都是基於文字格式,protobuf是二進位制格式。
你可以通過 ProtoBuf 定義資料結構,然後通過 ProtoBuf 工具生成各種語言版本的資料結構類庫,用於操作 ProtoBuf 協議資料
本教程介紹的是最新的protobuf proto3版本的語法。
二、使用ProtoBuf的例子
2.1 建立.proto檔案,定義資料結構
使用 ProtoBuf ,首先需要通過 ProtoBuf 語法定義資料結構(訊息),這些定義好的資料結構儲存在.proto為字尾的檔案中。
例子:
檔名: response.proto
// 指定protobuf的版本,proto3是最新的語法版本 syntax = "proto3"; // 定義資料結構,message 你可以想象成java的class,c語言中的struct message Response { string data = 1; // 定義一個string型別的欄位,欄位名字為data, 序號為1 int32 status = 2; // 定義一個int32型別的欄位,欄位名字為status, 序號為2 }
說明:proto檔案中,欄位後面的序號,不能重複,定義了就不能修改,可以理解成欄位的唯一ID。
2.2. 安裝ProtoBuf編譯器
protobuf的github釋出地址: https://github.com/protocolbuffers/protobuf/releases
protobuf的編譯器叫protoc,在上面的網址中找到最新版本的安裝包,下載安裝。
這裡下載的是:protoc-3.9.1-win64.zip , windows 64位系統版本的編譯器,下載後,解壓到你想要的安裝目錄即可。
提示:安裝完成後,將 [protoc安裝目錄]/bin 路徑新增到PATH環境變數中
開啟cmd,命令視窗執行protoc命令,沒有報錯的話,就已經安裝成功。
2.3. 將.proto檔案,編譯成指定語言類庫
protoc編譯器支援將proto檔案編譯成多種語言版本的程式碼,我們這裡以java為例。
切換到proto檔案所在的目錄, 執行下面命令
protoc --java_out=. response.proto
然後在當前目錄生成了一個ResponseOuterClass.java的java類檔案,這個就是我們剛才用protobuf語法定義的資料結構對應的java類檔案,通過這個類檔案我們就可以操作定義的資料結構。
2.4. 在程式碼中使用ProtoBuf對資料進行序列化和反序列化
因為上面的例子使用的是java, 我們先匯入protobuf的基礎類庫。
maven:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.9.1</version>
</dependency>
使用ProtoBuf的例子。
ResponseOuterClass.Response.Builder builder = ResponseOuterClass.Response.newBuilder();
// 設定欄位值
builder.setData("hello www.tizi365.com");
builder.setStatus(200);
ResponseOuterClass.Response response = builder.build();
// 將資料根據protobuf格式,轉化為位元組陣列
byte[] byteArray = response.toByteArray();
// 反序列化,二進位制資料
try {
ResponseOuterClass.Response newResponse = ResponseOuterClass.Response.parseFrom(byteArray);
System.out.println(newResponse.getData());
System.out.println(newResponse.getStatus());
} catch (Exception e) {
}
提示:大家不必在意不同的語言具體怎麼使用protobuf, 後面會有專門的章節介紹。