Protobuf協議原理與應用

一、Protocol Buffer協議

protobuf協議是谷歌定義的一種跨平台、跨語言的結構化數據交換格式。類比於xml的文本格式,它可以提供二進位級數據交換服務,所以相比於前者,它的處理速度更快、資源消耗更小。它可以對各種數據流(文件、字元串等)輕鬆讀寫。該協議目前支持Java、Python和C++代碼結構。

二、使用方法

1、首先根據需求定義消息文件(.proto)。定義方式類似於C++結構體,內部包含若干需要的屬性欄位。複雜一些的格式還可以使用嵌套定義。

2、由編譯器生成指定語言的源文件(如指定C++,會分別生成對應的.pb.h和.pb.cc文件)。編譯命令如下:

protoc -I = import_path --cpp_out = dst_dir import_path/file.proto

Advertisements

其中:protoc為protocol buffer提供的命令行編譯器;-I選項用於指定待編譯的proto文件所在目錄;--cpp_out指定生成c++代碼及路徑(同樣適用於python和java);最後參數指定proto文件路徑。

3、將生成的文件(file.pb.h和file.pb.cc)拷貝到工程,載入后即可使用。

三、實踐

1、下載protobuf源代碼,按說明編譯生成protoc和libprotobuf.so、libprotobuf-lite.so等文件,統一放在lib文件夾下。比較關鍵的是src文件夾,裡面包含基本文 件定義,後面會用到。(一開始直接下載可執行文件免於再編譯,後來使用時發現下載后只有protoc編譯器,缺少動態庫文件造成工程沒法編譯);

Advertisements

2、定義person.proto文件,如上圖所示;

3、找到protoc所在目錄,執行

protoc -I=/data/dev/ --cpp_out=/data/dev/ /data/dev/person.proto

生成person.pb.h、person.pb.cc文件;

4、在開發環境下構建C++項目,並將生成的兩個文件拷貝到項目目錄下。

5、配置項目包含目錄,主要指src文件夾;配置依賴庫,主要是libprotobuf-lite.so.9。

6、工程中包含person.pb.h,即可定義Person對象。

需要說明的是,編譯器生成的.h和.cc文件包含了對.proto文件屬性的setter和getter介面,以及讀寫二進位文件的SerializeToOstream及ParseFromIstream介面,這些介面均由編譯器自動生成。不允許修改這兩個文件。

Advertisements

你可能會喜歡