Protobuf使用(一)


Protobuf使用(一)
 
前言:
 
    最近由於接手一個支付的SDK項目,他們那邊的網絡請求和數據解析都與我平常接觸的項目不同,數據請求由於保密暫時不能說,但是數據解析用的是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
 
歡迎大家掃描關注我的微信公眾號,我會定期發布一些博客,分享一些知識點
 
 
 
本文參考資料:
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM