Google Protobuf簡明教程

Protobuf是什么

Protobuf實際是一套類似Json或者XML的數(shù)據(jù)傳輸格式和規(guī)范,用于不同應(yīng)用或進(jìn)程之間進(jìn)行通信時使用。通信時所傳遞的信息是通過Protobuf定義的message數(shù)據(jù)結(jié)構(gòu)進(jìn)行打包,然后編譯成二進(jìn)制的碼流再進(jìn)行傳輸或者存儲。

Protobuf的優(yōu)點

相比較而言,Protobuf有如下優(yōu)點:

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

如何安裝使用Protobuf

安裝

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

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

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

使用

使用Protobuf有如下幾個步驟:

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

下面以一個實際的例子來說明如何使用Protobuf,先展示出項目的實際目錄結(jié)構(gòu):

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

定義消息

Protobuf的消息結(jié)構(gòu)是通過一種叫做Protocol Buffer Language的語言進(jìn)行定義和描述的,實際上Protocol Buffer Language分為兩個版本,版本2和版本3,默認(rèn)不聲明的情況下使用的是版本2,下面以版本2為來舉個栗子, 假設(shè)我們定義了文件名為my.helloworld.proto的文件,如下:

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

然后我們需要使用protoc進(jìn)行編譯

protoc -I=./ --python_out=./ ./my.helloworld.proto
  • -I: 是設(shè)定源路徑
  • --python_out: 用于設(shè)定編譯后的輸出結(jié)果,如果使用其它語言請使用對應(yīng)語言的option
  • 最后一個參數(shù)是你要編譯的proto文件

現(xiàn)在已經(jīng)定義好了消息的數(shù)據(jù)結(jié)構(gòu),接下來看下如何使用

消息初始化和存儲傳輸

我們來通過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()

執(zhí)行writer.py之后就會將序列化的結(jié)果存儲在文件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:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,234評論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,446評論 4 61
  • 由于工程項目中擬采用一種簡便高效的數(shù)據(jù)交換格式,百度了一下發(fā)現(xiàn)除了采用 xml、JSON 還有 ProtoBuf(...
    黃海佳閱讀 49,181評論 1 23
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,663評論 19 139
  • 有一個名字,念出來就是一段風(fēng)景——阮玲玉;有一個名字,讀出來就是一段傷情——阮玲玉。 她16歲投身影壇,在九年內(nèi)拍...
    歸途行者閱讀 902評論 1 0

友情鏈接更多精彩內(nèi)容