Google Protobuf簡明教程

Protobuf是什麼

Protobuf實際是一套相似Json或者XML的數據傳輸格式和規範,用於不一樣應用或進程之間進行通訊時使用。通訊時所傳遞的信息是經過Protobuf定義的message數據結構進行打包,而後編譯成二進制的碼流再進行傳輸或者存儲。css

Protobuf的優勢

相比較而言,Protobuf有以下優勢:python

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

如何安裝使用Protobuf

安裝

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

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

若是本身編譯安裝的話能夠參考git上安裝指導,雖然寫得不清楚:)github

使用

使用Protobuf有以下幾個步驟:數據結構

  1. 定義消息
  2. 初始化消息以及存儲傳輸消息
  3. 讀取消息並解析

下面以一個實際的例子來講明如何使用Protobuf,先展現出項目的實際目錄結構:ide

.
├── 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的文件,以下:ui

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

而後咱們須要使用protoc進行編譯google

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

如今已經定義好了消息的數據結構,接下來看下如何使用spa

消息初始化和存儲傳輸

咱們來經過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:

做者:geekpy 連接:https://www.jianshu.com/p/b723053a86a6 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索