1. 程式人生 > >Google protobuf 使用及原理

Google protobuf 使用及原理

簡介

什麼是 Google Protocol Buffer? 假如您在網上搜索,應該會得到類似這樣的文字介紹:

Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言資料標準,目前已經正在使用的有超過 48,162 種報文格式定義和超過 12,183 個 .proto 檔案。他們用於 RPC 系統和持續資料儲存系統。

Protocol Buffers 是一種輕便高效的結構化資料儲存格式,可以用於結構化資料序列化,或者說序列化。它很適合做資料儲存或 RPC 資料交換格式。可用於通訊協議、資料儲存等領域的語言無關、平臺無關、可擴充套件的序列化結構資料格式。目前提供了 C++、Java、Python 三種語言的 API。

比如我們現在的使用場景,資料來源相關的業務由另一個團隊做,他們使用的語言是c++ ,我們專案中使用的是java語言,那麼問題來了,c++的資料怎麼發給我們呢,通過kafka,但是也需要有一定的標準吧,不然重複的工作量得多大啊,那就用paotobuf吧,兩個團隊公用一個.proto檔案,這樣無論是序列化還是反序列化,兩邊都保持一致,就這樣幹。

安裝 Google Protocol Buffer

在網站 http://code.google.com/p/protobuf/downloads/list上可以下載 Protobuf 的原始碼。然後解壓編譯安裝便可以使用它了。

安裝步驟如下所示:

1

2

3

4

5

6

tar -xzf protobuf-2.1.0.tar.gz

cd protobuf-2.1.0

./configure --prefix=$INSTALL_DIR

make

make check

make install

書寫 .proto 檔案

首先我們需要編寫一個 proto 檔案,定義我們程式中需要處理的結構化資料,在 protobuf 的術語中,結構化資料被稱為 Message。proto 檔案非常類似 java 或者 C 語言的資料定義。程式碼清單 1 顯示了例子應用中的 proto 檔案內容。

清單 1. proto 檔案

package lm;

message helloworld

{

   required int32     id = 1;  // ID

   required string    str = 2;  // str

   optional int32     opt = 3;  //optional field

}

編譯 .proto 檔案

寫好 proto 檔案之後就可以用 Protobuf 編譯器將該檔案編譯成目標語言了。本例中我們將使用 C++。

假設您的 proto 檔案存放在 $SRC_DIR 下面,您也想把生成的檔案放在同一個目錄下,則可以使用如下命令:

1

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto

命令將生成兩個檔案:

lm.helloworld.pb.h , 定義了 C++ 類的標頭檔案

lm.helloworld.pb.cc , C++ 類的實現檔案

在生成的標頭檔案中,定義了一個 C++ 類 helloworld,後面的 Writer 和 Reader 將使用這個類來對訊息進行操作。諸如對訊息的成員進行賦值,將訊息序列化等等都有相應的方法。

可以根據專案語言自己選擇生成各型別的pojo物件,c++使用c++的工具生成相應的對應在專案中使用,java則使用java相關的工具生成相應的class檔案,就可以使用了,序列化和反序列化就不在這講了