Protobuf是什么
Protobuf實(shí)際是一套類(lèi)似Json或者XML的數(shù)據(jù)傳輸格式和規(guī)范,用于不同應(yīng)用或進(jìn)程之間進(jìn)行通信時(shí)使用。通信時(shí)所傳遞的信息是通過(guò)Protobuf定義的message數(shù)據(jù)結(jié)構(gòu)進(jìn)行打包,然后編譯成二進(jìn)制的碼流再進(jìn)行傳輸或者存儲(chǔ)。
Protobuf的優(yōu)點(diǎn)
相比較而言,Protobuf有如下優(yōu)點(diǎn):
- 足夠簡(jiǎn)單
- 序列化后體積很小:消息大小只需要XML的1/10 ~ 1/3
- 解析速度快:解析速度比XML快20 ~ 100倍
- 多語(yǔ)言支持
- 更好的兼容性,Protobuf設(shè)計(jì)的一個(gè)原則就是要能夠很好的支持向下或向上兼容
如何安裝使用Protobuf
安裝
使用Python的話(huà)簡(jiǎn)便的安裝方法如下
1
2
|
pip install protobuf # 安裝protobuf庫(kù) sudo apt - get install protobuf - compiler # 安裝protobuf編譯器 |
如果自己編譯安裝的話(huà)可以參考git上安裝指導(dǎo),雖然寫(xiě)得不清楚:)
使用
使用Protobuf有如下幾個(gè)步驟:
- 定義消息
- 初始化消息以及存儲(chǔ)傳輸消息
- 讀取消息并解析
下面以一個(gè)實(shí)際的例子來(lái)說(shuō)明如何使用Protobuf,先展示出項(xiàng)目的實(shí)際目錄結(jié)構(gòu):
1
2
3
4
5
6
7
8
9
|
. ├── my │ ├── helloworld_pb2.py │ ├── helloworld_pb2.pyc │ └── __init__.py ├── mybuffer.io ├── my.helloworld.proto ├── reader.py └── writer.py |
定義消息
Protobuf的消息結(jié)構(gòu)是通過(guò)一種叫做Protocol Buffer Language的語(yǔ)言進(jìn)行定義和描述的,實(shí)際上Protocol Buffer Language分為兩個(gè)版本,版本2和版本3,默認(rèn)不聲明的情況下使用的是版本2,下面以版本2為來(lái)舉個(gè)栗子, 假設(shè)我們定義了文件名為my.helloworld.proto的文件,如下:
1
2
3
4
5
6
7
|
package my; message helloworld { required int32 id = 1; required string str = 2; optional int32 wow = 3; } |
然后我們需要使用protoc進(jìn)行編譯
1
|
protoc -I=./ --python_out=./ ./my.helloworld.proto |
- -I: 是設(shè)定源路徑
- --python_out: 用于設(shè)定編譯后的輸出結(jié)果,如果使用其它語(yǔ)言請(qǐng)使用對(duì)應(yīng)語(yǔ)言的option
- 最后一個(gè)參數(shù)是你要編譯的proto文件
現(xiàn)在已經(jīng)定義好了消息的數(shù)據(jù)結(jié)構(gòu),接下來(lái)看下如何使用
消息初始化和存儲(chǔ)傳輸
我們來(lái)通過(guò)writer.py來(lái)初始化消息并存儲(chǔ)為文件,代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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之后就會(huì)將序列化的結(jié)果存儲(chǔ)在文件mybuffer.io中,然后看下如何讀取
消息讀取與解析
我們通過(guò)reader.py來(lái)讀取和解析消息,代碼如下:
1
2
3
4
5
6
7
8
9
10
11
|
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:
到此這篇關(guān)于詳解Google Protobuf簡(jiǎn)明教程的文章就介紹到這了,更多相關(guān)Google Protobuf內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.jianshu.com/p/b723053a86a6