1. 程式人生 > >Java使用protobuf入門四步驟

Java使用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名不要一樣)。

message Person {
	
	// ID(必需)
	required int32 id = 1;
	
	// 姓名(必需)
	required string name = 2;
	
	// email(可選)
	optional string email = 3;

	// 朋友(集合)
	repeated string friends = 4;
}

上面的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專案則加入:


<dependency>
	<groupId>com.google.protobuf</groupId>
	<artifactId>protobuf-java</artifactId>
	<version>2.5.0</version>
</dependency>

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

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


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

public class Main {

	public static void main(String[] args) throws IOException {
		
		// 按照定義的資料結構,建立一個Person
		PersonMsg.Person.Builder personBuilder = PersonMsg.Person.newBuilder();
		personBuilder.setId(1);
		personBuilder.setName("叉叉哥");
		personBuilder.setEmail("[email protected]");
		personBuilder.addFriends("Friend A");
		personBuilder.addFriends("Friend B");
		PersonMsg.Person xxg = personBuilder.build();
		
		// 將資料寫到輸出流,如網路輸出流,這裡就用ByteArrayOutputStream來代替
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		xxg.writeTo(output);
		
		// -------------- 分割線:上面是傳送方,將資料序列化後傳送 ---------------
		
		byte[] byteArray = output.toByteArray();
		
		// -------------- 分割線:下面是接收方,將資料接收後反序列化 ---------------
		
		// 接收到流並讀取,如網路輸入流,這裡用ByteArrayInputStream來代替
		ByteArrayInputStream input = new ByteArrayInputStream(byteArray);
		
		// 反序列化
		PersonMsg.Person xxg2 = PersonMsg.Person.parseFrom(input);
		System.out.println("ID:" + xxg2.getId());
		System.out.println("name:" + xxg2.getName());
		System.out.println("email:" + xxg2.getEmail());
		System.out.println("friend:");
		List<String> friends = xxg2.getFriendsList();
		for(String friend : friends) {
			System.out.println(friend);
		}
	}

}



相關推薦

Java使用protobuf入門步驟

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

使用Protocol Buffers入門步驟

Protocol Buffers(簡稱protobuf)是谷歌的一項技術,用於將結構化的資料序列化、反序列化,經常用於網路傳輸。protobuf是谷歌的Protocol Buffers的簡稱,用於結構化資料和位元組碼之間互相轉換(序列化、反序列化,即實現從結構體轉換為位元組流

《數據倉庫工具箱》——建模步驟

blog 描述 輸入 mba 失敗 過程 功能 註意 ima Kimball建模方法的精髓,就是簡單、使用,建模這四步驟是它的核心部分。用術語表達是:始終一致的四步設計維度模型。 一、選擇業務過程 業務過程是由組織完成的一系列微觀活動,例如:完成下單、完成支付、發放代金

AndroidStudio快速入門:打造你的開發工具,settings必備

ack src paste libs box 下載 解釋 繼續 odi http://blog.csdn.net/jf_1994/article/details/50085825 前言:這裏是使用AS的基本設置,適合新入手的朋友閱讀,將這裏介紹的設置完基本使用無憂啦。 1、

MongoDB入門

rem osi images {} 大於 inf ati reat 數據 MongoDB針對實時位置 db.CallRecordInfo.find().count()db.SendInfo.find().count()db.RiderReaTimePositon.find(

mybatis快速入門()

北京 sele let dtd reac doctype his com 條件 mybatis動態標簽<where><if><foreach>以及sql片段 1.創建一個包裝類UserQueryVo.java package cn.my

Git基礎入門()Git基本操作2

git 操作 基礎忽略文件: 在實際開發過程中總有些文件無需納入Git的管理,比如日誌文件、臨時文件等 在這種情況下,我們可以在工作目錄中創建一個名為.gitignore的文件,列出要忽略的文件名或者表達式 例:cat .gitignore *.[oa]

Javascript入門()條件控制語句

OS 條件 else asc body script IT back 條件控制語句 一、條件控制語句 1. if <script type="text/javascript"> var num = 1 if( n

SpringBoot入門,添加MyBatis支持

timeout 是否 tex col cati 性能 出現 ram 2.x 項目基本配置參考SpringBoot入門一,使用myEclipse新建一個SpringBoot項目,使用myEclipse新建一個SpringBoot項目即可。現在來給項目添加一個MyBatis支持

C語言入門

/1.在螢幕上輸出以下圖案: //* //*** //***** //******* //********* //*********** //************* //*********** //********* //******* //***** //*** //* #incl

Shell程式設計入門:函式

使用者可以用shell定義函式,然後子啊shell指令碼中隨便呼叫。shell中函式的定義格式如下: [ function ] funname [()] { action; [return int;] } 可以帶 function fun() 定義,也可以

Redux入門開發步驟(一)

匯入命令建立redux專案 和配置redux依賴 create-react-app todoredux2 cd todoredux2 code . cnpm install react-redux cnpm install redux 使用cnpm 安裝不用npm安裝 :

SQL Server入門() 官網關於 SQL Server初級入門教程

學習內容 這些教程將幫助你理解 SSMS 中提供的資訊以及如何利用其功能。 熟悉 SSMS 的最好方式是進行實踐演練。 這些教程將使你熟悉 SSMS 中提供的各種功能。 這些教程將講述如何管理 SSMS 元件以及如何查詢常用的功能。 以下是本教程內容: 教

Elasticsearch入門:Elasticsearch-搜尋、過濾、聚合

title: Elasticsearch入門四:Elasticsearch-搜尋、過濾、聚合(譯) date: 2018-11-01 17:00:00 tags: Elasticsearch 原文地址: https://www.elastic.co/guide/en/elast

JS入門

  js的本質就是處理資料。資料來自於後臺的資料庫。 所以變數就臨時起到了儲存資料的作用。 ECMAScript制定了js的資料型別 資料型別有哪些?string、number、Boolean、unll、undefined、object(array、json、function、date、數字

nginx入門學習步驟(linux)

一.nginx下載(nginx-1.9.9) http://nginx.org/download/ 二.解壓到指定資料夾 tar -zxvf 解壓縮檔案 三.設定配置資訊   在nignx解壓資料夾內執行命令: ./configure --prefix=/usr/java/ngi

JavaScript-D3入門-事件繫結

直接給出可以在WebServer中執行的程式碼,通過這個示例,你可以知道如何進行事件繫結 表格資料官方建議用csv執行效率高 d3ia_2.html <html> <head> <title>D3 in Action Examples</tit

<MySQL>入門 事務控制語言 TCL

-- TCL /* Transcation Control Language 事務控制語言 事務:一個或一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行 案例:轉賬 name 餘額 麥克雷 1000

<MyBatis>入門 傳入的參數處理

string 問題 解決 ati ash 特殊 spa per transfer 1.單個參數   傳入單個參數時,mapper文件中 #{}裏可以寫任意值 /** * 傳入單個參數 */ Employee getEmpById(Int

Linux 驅動程式入門

版權宣告 本文為博主隨手筆記,歡迎評論和轉載 https://www.cnblogs.com/dl04301201/p/10114103.html 博主CNSD原文 :https://mp.csdn.net/mdeditor/84987796 驅動是具有入口和出口的一組方法的集合,這一組方法才是驅動的核心內