詳解Google Protobuf簡明教程
Protobuf是什么
Protobuf實際是一套類似Json或者XML的數(shù)據(jù)傳輸格式和規(guī)范,用于不同應用或進程之間進行通信時使用。通信時所傳遞的信息是通過Protobuf定義的message數(shù)據(jù)結(jié)構進行打包,然后編譯成二進制的碼流再進行傳輸或者存儲。
Protobuf的優(yōu)點
相比較而言,Protobuf有如下優(yōu)點:
- 足夠簡單
- 序列化后體積很小:消息大小只需要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,先展示出項目的實際目錄結(jié)構:
. ├── my │ ├── helloworld_pb2.py │ ├── helloworld_pb2.pyc │ └── __init__.py ├── mybuffer.io ├── my.helloworld.proto ├── reader.py └── writer.py
定義消息
Protobuf的消息結(jié)構是通過一種叫做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: 用于設定編譯后的輸出結(jié)果,如果使用其它語言請使用對應語言的option
- 最后一個參數(shù)是你要編譯的proto文件
現(xiàn)在已經(jīng)定義好了消息的數(shù)據(jù)結(jié)構,接下來看下如何使用
消息初始化和存儲傳輸
我們來通過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:
到此這篇關于詳解Google Protobuf簡明教程的文章就介紹到這了,更多相關Google Protobuf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
一個批量編碼轉(zhuǎn)換及ASP/JS加解密/簡繁轉(zhuǎn)換的工具
一個批量編碼轉(zhuǎn)換及ASP/JS加解密/簡繁轉(zhuǎn)換的工具...2007-05-05
vs快捷鍵 用好Ctrl+Enter與Ctrl+Shift+Enter組合鍵讓你的編輯代碼速度快了很多
使用Ctrl+Enter組合鍵在上方插入一行,使用Ctrl+Shift+Enter組合鍵在下方插入一行2011-04-04
解決啟動Azkaban報錯問題:java.lang.NoSuchMethodError: com.google.comm
這篇文章主要介紹了啟動Azkaban報錯:java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap,需要的朋友可以參考下2020-05-05
Apifox?Echo學習curl?httpie?命令使用詳解
這篇文章主要為大家介紹了通過Apifox?Echo學習curl?httpie?命令使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09

