Java使用Protocol Buffers入門四步驟

Protocol Buffers(簡稱protobuf)是谷歌的一項技術。用於將結構化的數據序列化、反序列化。經常常使用於網絡傳輸。html

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

protobuf支持各類語言。本文以Java爲例。簡介protobuf怎樣使用。json

其它語言用法類似。
網絡

首先需要下載:
數據結構

http://download.csdn.net/download/xiao__gui/7586617
maven

解壓後有兩個文件:protobuf-java-2.5.0.jar和protoc.exe。工具


protobuf-java-2.5.0.jar即protobuf所需要的jar包。假設用maven的話可以無視這個文件;
ui

protoc.exe是protobuf代碼生成工具。
google

第一步:定義數據結構
.net

首先要定義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;
}

上面的一、二、三、4是unique numbered tag,是一個惟一標識。


上面的樣例中定義了一個很easy的數據結構,固然還可以定義更復雜的結構,這裏再也不討論,詳細可以看官方文檔。


第二步: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("xxg@163.com");
		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);
		}
	}

}


做者:叉叉哥   轉載請註明出處:http://blog.csdn.net/xiao__gui/article/details/36643949

相關文章
相關標籤/搜索