Protocol Buffer格式傳輸


1.簡單明了介紹ProtocolBuffer

2. ProtocolBuffer(pb)所做事情其實類似於xml、json,也就是把某種數據結構的信息依照某種格式保存起來。主要用於數據存儲、傳輸等。

3. 效率高,支持多種編程語言。

4. 本地搭建環境

  首先安裝MAVEN

   下載apache-maven-3.3.3-bin.zip解壓縮

   在環境變量中添加M2_HOME值為解壓的目錄

   在環境變量path中添加%M2_HOME%\bin

   輸入mvn v查看版本驗證安裝成功之后獲取protobuf的jar包

   下載protobuf-2.5.0.zipprotoc-2.5.0-win32.zip解壓(下文中用d:\ protobuf-2.5.0d:\win32舉例作為解壓目錄)

   將d:\win32中protoc.exe復制D:\protobuf-2.5.0\src,打開cmd,D:\protobuf-2.5.0\java下執行mvn install

   在D:\protobuf-2.5.0\java\target得到protobuf-java-2.5.0.jar文件導入到項目中。就ok了。

5. 核心文件.proto文件相當於確定數據協議,數據結構中存在了哪些數據,數據類型是什么。

6. 限定修飾符

        required 不可增加或刪除的字段,在程序中的build之前必須先初始化,不然會拋異常。

   optional 可選字段,可刪除、可以不初始化。

   repeated 可重復字段,對應到Java文件里 就是list

7. 定義.proto文件

          message User{

    required int32 acctID = 1;
       required string passwd = 2;
  }

      1. message是消息定義的關鍵字,等同於C++中的struct/class,或是Java中的class。
      2. LogonReqMessage為消息的名字,等同於結構體名或類名。
      3. required前綴表示該字段為必要字段,既在序列化和反序列化之前該字段必須已經被賦值。與此同時,在Protocol Buffer中還存在另外兩個類似的關鍵字,optional和repeated,帶有這兩種限符          的消息字段則沒有required字段這樣的限制。相比於optional,repeated主要用於表示數組字段。具體的使用方式在后面的用例中均會一一列出。
      4. int64和string分別表示長整型和字符串型的消息字段,在Protocol Buffer中存在一張類型對照表,既Protocol Buffer中的數據類型與其他編程語言(C++/Java)中所用類型的對照。該對照表中將          給出在不同的數據場景下,哪種類型更為高效。該對照表將在后面給出。
      5. acctID和passwd分別表示消息字段名,等同於Java中的域變量名,或是C++中的成員變量名。
      6. 標簽數字12則表示不同的字段的唯一編號,在序列化后的二進制數據中的布局位置。在該例中,passwd字段編碼后的數據一定位於acctID之后。需要注意的是該值在同一message中不能重復。          另外,對於Protocol Buffer而言,標簽值為1到15的字段在編碼時可以得到優化,既標簽值和類型信息僅占有一個byte,標簽范圍是16到2047的將占有兩個bytes,而Protocol Buffer可以支持字          段數量則為2的29次方減一。有鑒於此,我們在設計消息結構時,可以盡可能考慮讓repeated類型的字段標簽位於1到15之間,這樣便可以有效的節省編碼后的字節數量。

8. 生成Java類

  命令:進入protoc.exe 所在的目錄下 執行:protoc.exe --java_out=./ user.proto

9. 在Java中使用

      假設在.pro文件中定義一個屬性為 bytes name

Java中可以這樣寫:

String name = aaaa;

user.setName(ByteString.copyFromUtf8(name)); 即可。

 

   java中ByteString的值

假如反序列化后的屬性值為 ByteString類型的,那么可以

通過user.getName().toStingUtf8(); 即可。


免責聲明!

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



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