1. 程式人生 > 其它 >(一)ProtoBuf入門教程

(一)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, 後面會有專門的章節介紹。