Protobuf使用(一)
阿新 • • 發佈:2018-01-09
參考資料 repeat ase 安裝 新版本 目前 編程 圖片 toc Protobuf使用(一)
前言:
最近由於接手一個支付的項目,他們那邊的網絡請求和數據解析都與我平常接觸的項目不同,數據請求由於保密暫時不能說,但是數據解析用的是Protobuf,於是我就順便看了下Protobuf一些安裝、使用的一些的方法,有一些簡單的使用新的經驗總結,希望能夠幫助到大家,不多說,上正文:
Protobuf是什麽:
本文簡單介紹一下Protobuf是什麽,它的優缺點,還有如何通過命令生成一個java文件,本次主要是介紹版本2.6.1,Proto2,它還有Proto3,以後的系列慢慢介紹。
Protocol Buffers是一個跨語言、跨平臺的具有可擴展機制的序列化數據工具。也就是說,我在ubuntu下用python語言序列化一個對象,並使用http協議傳輸到使用java語言的android客戶端,java使用對用的代碼工具進行反序列化,也可以得到對應的對象。聽起來好像跟json沒有多大區別。。。其實區別挺多的。
Google說protobuf是smaller,faster,simpler,我們使用google規定的proto協議定義語言,之後使用proto的工具對代碼進行“編譯”,生成對應的各個平臺的源代碼,我們可以使用這些源代碼進行工作。
比如說程序中生成了一個鏈表,但是程序退出重啟後,還要重新生成鏈表,有時候,我們很需要上次程序中該鏈表中記錄的數據。這些數據或許是經過很多大量運算生成的,每次都重新生成這些數據的話,需要消耗大量時間。這時候就可以考慮使用protobuf,將其序列化後保存在文件中,下次使用的時候,加載文件,反序列化後就可以直接使用了。
值得註意的是,protobuf是以二進制來存儲數據的。相對於JSON和XML具有以下優點:
1,簡潔
2,體積小:消息大小只需要XML的1/10 ~ 1/3
3,速度快:解析速度比XML快20 ~ 100倍
4,使用Protobuf的編譯器,可以生成更容易在編程中使用的數據訪問代碼
5,更好的兼容性,Protobuf設計的一個原則就是要能夠很好的支持向下或向上兼容
Mac環境集成Protobuf:
1. 下載protobuf2.6.1:https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
2. 解壓下載的文件
3. cd到protobuf-2.6.1目錄
4. $./configure
5. $make
6. $make check
7. $sudo make install (需要接著輸入密碼)
8. $which protoc
9. $protoc --version
PS:(這是集成他的以前的舊版本,最新版本已經更新到3.5.1了,後續博客會接著介紹新版本的使用)
-------------------安裝完畢-------------------
Protobuf 語法格式(Proto2):
我們需要定義一個.proto格式的文件,裏面寫的才是Protobuf格式的代碼,我們先來看看Protobuf支持的數據類型:
目前Protobuf支持的數據類型和c++和java對應如下:
我們的.proto的文件示例如下:
syntax = "proto2";
package xiaomi.gamecenter.milink.msg;
option java_package = "org.xiaomi.gamecenter.milink.msg";
option java_outer_classname = "CreateOrderReq";
message OrderReq {
required string uid = 1;
optional int32 amount = 2;
optional int32 resultCode = 3;
}
OrderReq就是消息的名字,該消息有3個字段,在消息中承載的數據分別對應於每一個字段。其中每個字段都有一個修飾符,一種類型,一個名字和一個編號。
所指定的字段類型修飾符必須是如下之一:
required:一個格式良好的消息一定要含有1個這種字段。表示該值是必須要設置的;
optional:消息格式中該字段可以有0個或1個值(不超過1個),也就是可有可無;
repeated:在一個格式良好的消息中,這種字段可以重復任意多次(包括0次)。重復的值的順序會被保留。表示該值可以重復,相當於java中的List。
註意:第一行必須 (syntax = "proto2";)標識語法格式的版本,之後是包名,java_outer_classname 標識生成的java文件的名稱,並且其不能與.proto文件的名稱相同,也不能與“message OrderReq”中的“OrderReq”名稱相同,否則會報名稱錯誤;
Protobuf 命令生成java文件:
protoc --plugin=/usr/local/bin/protoc-gen-objc ./CreateOrderReq.proto --java_out="/Users/zhengjunfei/miui/oauth/sdk_oauth/Plugin/src/"
其中紅色字體表示的是.proto文件的路徑,綠色字體標明的是輸出的java格式文件的路徑。其中藍色的標識的是輸出的文件格式,cpp_out、--java_out、--python_out命令分別可以生成C++、Java、Python代碼。
完結:
後續會介紹protobuf的最新版本的使用包括在Android studio中的集成,希望大家能夠後續持續關註,並且希望能夠給大家提供到幫助,謝謝!
如要轉載,請註明出處,謝謝!
歡迎關註我的博客園博客,地址是:
https://www.cnblogs.com/zhengjunfei/
同時歡迎大家關註我的簡書博客,地址是:
https:www.jianshu.com/u/da06e00edefa
歡迎大家掃描關註我的微信公眾號,我會定期發布一些博客,分享一些知識點
本文參考資料:
http://www.mamicode.com/info-detail-955103.html
http://blog.csdn.net/ashimidashajia/article/details/48997627
Protobuf使用(一)