1. 程式人生 > >java eclipse使用Protocol Buffers(簡稱protobuf)

java eclipse使用Protocol Buffers(簡稱protobuf)

Protocol Buffers(簡稱protobuf)是谷歌的一項技術,用於將結構化的資料序列化、反序列化,經常用於網路傳輸。

這貨實際上類似於XML生成和解析,但protobuf的效率高於XML,不過protobuf生成的是位元組碼,可讀性比XML差。類似的還有json、Java的Serializable等。

protobuf支援各種語言。本文以Java為例,簡單介紹protobuf如何使用。其他語言使用方法類似。

首先需要下載:

----------------------------------------------------------------------------------

選擇對應的版本下載

----------------------------------------------------------------------------------

解壓後有兩個檔案:protobuf-java-2.5.0.jar和protoc.exe。

protobuf-java-2.5.0.jar即protobuf所需要的jar包,如果用maven的話可以無視這個檔案;

protoc.exe是protobuf程式碼生成工具。

第一步:定義資料結構

首先要定義protobuf的資料結構,這裡要寫一個.proto檔案。這個檔案有點類似於定義一個類。例如定義一個Person,儲存檔案PersonMsg.proto(注意檔名和裡面的message名不要一樣)。

  1. message Person {  
  2.     // ID(必需)  
  3.     required int32 id = 1;  
  4.     // 姓名(必需)  
  5.     required string name = 2;  
  6.     // email(可選)  
  7.     optional string email = 3;  
  8.     // 朋友(集合)  
  9.     repeated string friends = 4;  
  10. }  

上面的1、2、3、4是unique numbered tag,是一個唯一標識。

上面的例子中定義了一個非常簡單的資料結構,當然還可以定義更復雜的結構,這裡不再討論,具體可以看官方文件。

第二步:protoc.exe生成Java程式碼

使用檔案protoc.exe,cmd命令列執行:

protoc.exe --java_out=E:\java PersonMsg.proto

輸入檔案是PersonMsg.proto,也就是定義資料結構的檔案;輸出資料夾是E:\java,將java檔案生成在E:\java中。執行命令成功後會生成PersonMsg.java:


在Eclipse中建立一個專案,將java檔案拷貝到專案中。專案中需要引入protobuf-java-2.5.0.jar包。如果是maven專案則加入:

  1. <dependency>
  2.     <groupId>com.google.protobuf</groupId>
  3.     <artifactId>protobuf-java</artifactId>
  4.     <version>2.5.0</version>
  5. </dependency>

第三步:序列化
第四步:反序列化

一般來說,序列化和反序列化是分開的。例如網路傳輸,由一方將資料序列化後傳送給另一方來接收並解析,序列化傳送和接收反序列化並不在一起。但是下面為了例子簡單將二者寫在同一程式中。

  1. import java.io.ByteArrayInputStream;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.IOException;  
  4. import java.util.List;  
  5. publicclass Main {  
  6.     publicstaticvoid main(String[] args) throws IOException {  
  7.         // 按照定義的資料結構,建立一個Person
  8.         PersonMsg.Person.Builder personBuilder = PersonMsg.Person.newBuilder();  
  9.         personBuilder.setId(1);  
  10.         personBuilder.setName("叉叉哥");  
  11.         personBuilder.setEmail("[email protected]");  
  12.         personBuilder.addFriends("Friend A");  
  13.         personBuilder.addFriends("Friend B");  
  14.         PersonMsg.Person xxg = personBuilder.build();  
  15.         // 將資料寫到輸出流,如網路輸出流,這裡就用ByteArrayOutputStream來代替
  16.         ByteArrayOutputStream output = new ByteArrayOutputStream();  
  17.         xxg.writeTo(output);  
  18.         // -------------- 分割線:上面是傳送方,將資料序列化後傳送 ---------------
  19.         byte[] byteArray = output.toByteArray();  
  20.         // -------------- 分割線:下面是接收方,將資料接收後反序列化 ---------------
  21.         // 接收到流並讀取,如網路輸入流,這裡用ByteArrayInputStream來代替
  22.         ByteArrayInputStream input = new ByteArrayInputStream(byteArray);  
  23.         // 反序列化
  24.         PersonMsg.Person xxg2 = PersonMsg.Person.parseFrom(input);  
  25.         System.out.println("ID:" + xxg2.getId());  
  26.         System.out.println("name:" + xxg2.getName());  
  27.         System.out.println("email:" + xxg2.getEmail());  
  28.         System.out.println("friend:");  
  29.         List<String> friends = xxg2.getFriendsList();  
  30.         for(String friend : friends) {  
  31.             System.out.println(friend);  
  32.         }  
  33.     }  
  34. }  


相關推薦

java eclipse使用Protocol Buffers簡稱protobuf

Protocol Buffers(簡稱protobuf)是谷歌的一項技術,用於將結構化的資料序列化、反序列化,經常用於網路傳輸。這貨實際上類似於XML生成和解析,但protobuf的效率高於XML,不過protobuf生成的是位元組碼,可讀性比XML差。類似的還有json、J

PostgreSQL 簡稱gp小集

times ear logs server 日期 cnblogs date sta blog 1. SQLyog & Navicat   SQLyog可以管理 MySQL Navicat 可以管理 SQL Server,MySQL,PostgreSQL,SQ

Java-簡單加密亦或

nextline 字符轉換 lin toc 16px 進行 accept col sta 1 import java.net.PasswordAuthentication; 2 import java.util.Scanner; 3 4 public class

java 構造器 構造方法

fin {} 相同 java 開發 height private 實例 數據類型 public 構造器 (constructor,構造方法) 3W what ? why? how? 是什麽 , 為什麽, 怎麽用? 註意事項? What ? 是什麽: 構造器(又叫構造方法)本

java學習日記1-7

har span 編譯失敗 數組長度 int() 冒泡排序 string length 類型 java 中標識符可以為$符, 默認是int類型超出int型必須標明是long型char 為 2字節String 是引用類型 byte b = 1;b = b + 1; #會報錯

Java——String類常用類

get build pan spa 長度 endwith 同步 兩個 charat 一、String類——描述字符串 常用的方法簡單介紹: 1.charAt()    獲取對應位置的字符 2.length()    獲取字符串的長度 3.concat()    在字符串的尾

Java小案例行星移動

println dmi dap ova gre 建議 his 矩形 graphic Java小案例 行星移動:參考:三百集 使用軟件:idea2017,java 1,圖片集:這裏 (idea圖片源放在target目錄下,才能訪問到),建議從小往上看。。。 2,定義MyFr

JAVA NIO buffer 知識三

java niojava nio 裏的buffer是緩存數據,通常緩沖區是一個數組,字節數組,也可以是別的類型。最常用的就是bytebuffer,還有一些其它的類型:charbuffer,shortbuffer,intbuffer,longbuffer,floatbuffer,doublebufer。一開始在

Java小案例-逃離迷宮

class hide open isempty adl isp view rgs *** Java小案例-(逃離迷宮) 一,迷宮需求描述: 1,用戶輸入迷宮圖(限制方形):字母1位墻,0為通,e為出口,m為入口,*為已訪問的位置,用外圍1圍住迷宮 2,運行軌跡右,左,下,上

最完整的Mybatis Generator簡稱MBG的最完整配置文件,帶詳解,再也不用去看EN的User Guide了;

tor 開始 設置 gen false dsc user ren led <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//myba

Java學習筆記十五:import關鍵字

http 技術分享 import logs java學習筆記 .cn 關鍵字 blog ava Java學習筆記(十五):import關鍵字

Java學習筆記十五:this關鍵字

bsp java image nbsp his this mage 學習筆記 筆記 Java學習筆記(十五):this關鍵字

Java學習筆記十六:static關鍵字

ima 關鍵字 static關鍵字 es2017 java學習筆記 sta com 筆記 nbsp Java學習筆記(十六):static關鍵字

Java學習筆記十七:super關鍵字

mage cnblogs 分享 關鍵字 super關鍵字 log .cn nbsp java Java學習筆記(十七):super關鍵字

Java學習筆記二十三:final關鍵字

類繼承 ron 滿足 單詞 靜態 bsp 條件 str 進行 final關鍵字有三種使用場景: final修飾類 final修飾方法 final修飾變量 final修飾的類,不能再有子類繼承。 只要滿足以下條件就可以把一個類設計為final類: 不是專門為繼承而設

Java之Array數組說明

blog ava nis .com add body tps new lin 代碼說明: 1 package array; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 impor

Java設計模式Design Patterns——可復用面向對象軟件的基礎

過程 多線程 安全 進行 有助於 並且 -c 完全 兩種 設計模式(Design Patterns) 設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼

深入理解java虛擬機十二 Java 語法糖背後的真相

它的 blog 需要 原來 ont 影響 else 階段 board 語法糖(Syntactic Sugar),也叫糖衣語法,是英國計算機科學家彼得·約翰·蘭達(Peter J. Landin)發明的一個術語。指的是,在計算機語言中添加某種語法,這些語法糖雖然不會對語言的功

java%取模14號

3ds print .... pan word stat ava args smi java取模運算支持類型:字符型(不包括負數),字節型,短整型,整形,長整型,單精度浮點型,雙精度浮點型 java奇偶判斷 用偶數進行判斷 如果用奇數進行判斷會出現以下問題: public

Java學習總結十四——java反射機制,利用反射動態創建對象

Java反射 動態創建對象 一.Java反射機制1.什麽是反射:反射就是把Java類中的各種成份影射成一個個的Java對象。例:一個類有:成員變量,方法,構造方法等,包等等信息,利用反射技術可以對一個類進行剖析,把各個組成部分影射成一個個對象。2.Java反射常用類:(1)Class類—可獲取類和類的