1. 程式人生 > 程式設計 >詳解Google Protobuf簡明教程

詳解Google Protobuf簡明教程

Protobuf是什麼

Protobuf實際是一套類似Json或者XML的資料傳輸格式和規範,用於不同應用或程序之間進行通訊時使用。通訊時所傳遞的資訊是通過Protobuf定義的message資料結構進行打包,然後編譯成二進位制的碼流再進行傳輸或者儲存。

Protobuf的優點

相比較而言,Protobuf有如下優點:

  • 足夠簡單
  • 序列化後體積很小:訊息大小隻需要XML的1/10 ~ 1/3
  • 解析速度快:解析速度比XML快20 ~ 100倍
  • 多語言支援
  • 更好的相容性,Protobuf設計的一個原則就是要能夠很好的支援向下或向上相容

如何安裝使用Protobuf

安裝

使用Python的話簡便的安裝方法如下

pip install protobuf  # 安裝protobuf庫
sudo apt-get install protobuf-compiler # 安裝protobuf編譯器

如果自己編譯安裝的話可以參考git上安裝指導,雖然寫得不清楚:)

使用

使用Protobuf有如下幾個步驟:

  • 定義訊息
  • 初始化訊息以及儲存傳輸訊息
  • 讀取訊息並解析

下面以一個實際的例子來說明如何使用Protobuf,先展示出專案的實際目錄結構:

.
├── my
│  ├── helloworld_pb2.py
│  ├── helloworld_pb2.pyc
│  └── __init__.py
├── mybuffer.io
├── my.helloworld.proto
├── reader.py
└── writer.py

定義訊息

Protobuf的訊息結構是通過一種叫做Protocol Buffer Language的語言進行定義和描述的,實際上Protocol Buffer Language分為兩個版本,版本2和版本3,預設不宣告的情況下使用的是版本2,下面以版本2為來舉個栗子,假設我們定義了檔名為my.helloworld.proto的檔案,如下:

package my;
message helloworld
{
  required int32 id = 1;
  required string str = 2;
  optional int32 wow = 3;
}

然後我們需要使用protoc進行編譯

protoc -I=./ --python_out=./ ./my.helloworld.proto
  • -I: 是設定源路徑
  • --python_out: 用於設定編譯後的輸出結果,如果使用其它語言請使用對應語言的option
  • 最後一個引數是你要編譯的proto檔案

現在已經定義好了訊息的資料結構,接下來看下如何使用

訊息初始化和儲存傳輸

我們來通過writer.py來初始化訊息並存儲為檔案,程式碼如下:

from my.helloworld_pb2 import helloworld

def main():
  hw = helloworld()
  hw.id = 123
  hw.str = "eric"
  print hw

  with open("mybuffer.io","wb") as f:
    f.write(hw.SerializeToString())

if __name__ == "__main__":
  main()

執行writer.py之後就會將序列化的結果儲存在檔案mybuffer.io中,然後看下如何讀取

訊息讀取與解析

我們通過reader.py來讀取和解析訊息,程式碼如下:

from my.helloworld_pb2 import helloworld

def main():
  hw = helloworld()
  with open("mybuffer.io","rb") as f:
    hw.ParseFromString(f.read())
    print hw.id
    print hw.str

if __name__ == "__main__":
  main()

Reference:

Developer Guide
Github

到此這篇關於詳解Google Protobuf簡明教程的文章就介紹到這了,更多相關Google Protobuf內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!