Java資料通訊中使用Google Protobuf實現序列化與反序列化
一、.什麼是protocol buffer
ProtocolBuffer是用於結構化資料序列化的靈活、高效、自動的方法,有如XML,不過它更小、更快、也更簡單。你可以定義自己的資料結構,然後使用程式碼生成器生成的程式碼來讀寫這個資料結構。你甚至可以在無需重新部署程式的情況下更新資料結構。
l Google定義的一種序列化的協議格式;
l Google內部幾乎所有的RPC呼叫及檔案格式;
(據稱當前google已經定義了12,183個.proto檔案,共有48,162種不同的message型別。它們用於RPC系統或各種儲存系統中進行資料的儲存)
l 目標:
Ø 簡單性
Ø 相容性
Ø 高效能
二、如何使用
2. 選擇proto.exe壓縮包protoc-2.4-win32.zip和protobuf-java-2.4.1.jar壓縮包protobuf-2.4.zip
3.下載一個protobuf-java-2.4.1.jar檔案(注意,要與你剛才下的proto.exe版本相同,否則可能出現編譯通不過現象)
4.在proto.exe同級目錄,編寫一個netbean.proto檔案,為需要序列化的資料介面加入一個message屬性,為每一個欄位指定名稱和型別,如下所示(message 的名稱不能與java_outer_classname 名稱相同,不然編譯不過 ):
package com.leehongee.netserver.net.bean;
option java_package = "com.leehongee.netserver.net.bean";
option java_outer_classname = "Request";
message request_Net {
required string cmd = 1;
optional int32 keycode = 2;
optional sint32 posX = 3;
optional sint32 posY = 4;
optional bool onOrOff = 5;
optional bool ontouch = 6;
}
備註:限定修飾符 required ,optional ,repeated
required: 表示是一個必須欄位,必須相對於傳送方,在傳送訊息之前必須設定該欄位的值,對於接收方,必須能夠識別該欄位的意思。
optional:表示是一個可選欄位,可選對於傳送方,在傳送訊息時,可以有選擇性的設定或者不設定該欄位的值。
repeated:表示該欄位可以包含0~N個元素。其特性和optional一樣,但是每一次可以包含多個值。
5.使用CMD命令編譯這個netbean.proto檔案:
D:\protoc-2.4.1-win32>protoc.exe --java_out=./ netbean.proto
6.在目錄com\leehongee\netserver\net\bean 目錄下將生成一個Request.java原始檔,並將其引入到Myeclipse中
7.把jar包protobuf-java-2.4.1.jar也引入到工程libs目錄中
8.使用方法呼叫序列化:
Request .request_Net .Builder builder=Request .request_Net ..newBuilder();
builder.setCmd("ontouch");
Request .request_Net request=builder.builder();
byte[] buffer=request.toByteAarray();
9.使用反序列化:
try{
Request .request_Net request = Request .request_Net .parseFrom(buffer);
}
catch(Exception ex){
System.out.println(ex.getMessage());
}
三、具體例項實現
1、編寫 test.proto檔案:
- option java_package = "com.proto";
- option java_outer_classname = "FirstProtobuf";
- message TestBuf {
- required int32 ID = 1;
- required string Url = 2;
- }
- protoc.exe --java_out=./ test.proto
- package com.test;
- import java.io.IOException;
- import com.proto.FirstProtobuf;
- import com.proto.FirstProtobuf.TestBuf;
- publicclass TestProtoBuf {
- publicstaticvoid main(String[] args) throws IOException {
- //序列化過程
- //FirstProtobuf是生成類的名字,即proto檔案中的java_outer_classname
- //testBuf是裡面某個序列的名字,即proto檔案中的message testBuf
- FirstProtobuf.TestBuf.Builder builder = FirstProtobuf.TestBuf.newBuilder();
- builder.setID( 123 );
- builder.setUrl("http://www.21cn.com");
- TestBuf info = builder.build();
- byte[] buf = info.toByteArray();
- TestBuf tb = TestBuf.parseFrom(buf);
- System.out.println( tb.getID());
- System.out.println( tb.getUrl());
- }
- }
相關推薦
Java資料通訊中使用Google Protobuf實現序列化與反序列化
一、.什麼是protocol buffer ProtocolBuffer是用於結構化資料序列化的靈活、高效、自動的方法,有如XML,不過它更小、更快、也更簡單。你可以定義自己的資料結構,然後使用程式碼生成器生成的程式碼來讀寫這個資料結構。你甚至可以在無需重新
Google Protobuf——實現跨平臺跨語言的序列化/反序列化
Google Protobuf——實現跨平臺跨語言的序列化/反序列化 0 Overview Google Protocol Buffer 是一個平臺無關、語言無關的結構化資料的序列化與反序列化工具。 1 Establish dev environment wget http:
Java核心類庫-IO-對象流(實現序列化與反序列化)
.get throws 反序 code row cts new java cep 使用對象流來完成序列化和反序列化操作: ObjectOutputStream:通過writeObject()方法做序列化操作的 ObjectInputStream:通過readObje
Apache Avro 序列化與反序列化 (Java 實現)
Avro像兩個交流一樣要找一個互相能理解的語言, 在國內為普通話, 跑國外多用英語相通, 兩個進程間通信也需要找一個大家都能理解的數據格式. 簡單的如 JSON, XML, 那是自我描述性格式, XML 有 Schema 定義, 但尚無正式的 JSON Schema 規範. 在講求效率的場合, 純文本式的數據
基礎 | Java序列化與反序列化的底層實現
在深拷貝與淺拷貝中,提到可以採用「序列化與反序列化」的方式來實現深拷貝,今天主要來填一下序列化的坑。 其中,序列化是一種物件持久化的手段,普遍應用於網路傳輸和遠端方法呼叫(RMI)等場景中,建議關注。 什麼是Java序列化和反序列化? 參考答案: 在Java中
java中序列化與反序列化的問題
java序列化是將java物件轉換為位元組序列的過程,變成計算機能夠儲存的二進位制序列 反序列化是將位元組序列恢復成java物件的過程 1.當兩個Java程序進行通訊時,能否實現程序間的物件傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反
【劍指offer】Java實現-序列化與反序列化二叉樹
題目描述 實現兩個函式,分別用來序列化和反序列化二叉樹 思路 序列化:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中簡歷起來的二叉樹可以持久儲存 反序列化:根據某
java中的序列化與反序列化
序列化與反序列化 一 、什麼是序列化與反序列化 把物件轉換為位元組序列的過程稱為物件的序列化。 把位元組序列恢復為物件的過程稱為物件的反序列化 一個物件只要實現了Serilizable介面,這個物件就可以被序列化,java的這種序列化模式為開發者提供了很多便利
java中序列化與反序列化
把物件轉換為位元組序列的過程稱為物件的序列化。 把位元組序列恢復為物件的過程稱為物件的反序列化。 物件的序列化主要有兩種用途: 1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中; 2) 在網路上傳送物件的位元組序列
Java中的基礎----序列化與反序列化的作用
Java提供兩種物件持久化的方式,分別序列化和外部序列化。 1)序列化(Serialization): 在分散式環境下,無論是何種資料,都會以二進位制序列的形式在網路上傳輸。序列化是一種將物件以一連串的位元組描述的過程,用於解決在對物件流進行讀寫操作時
java序列化與反序列化中transient和static成員剖析
在我的上一篇博文中講解了一些基本的關於java序列化與反序列化的問題,現在我們一起來對物件中宣告為transient和static的變數進行解析。 1:類中宣告為transient變數 一旦類中某個變數宣告為transient,則會告訴JVM,你不用幫我序列化該變數,我自己
有關java中物件序列化與反序列化的亂碼問題
在一開始學習java流操作中的有關物件序列化與非序列化的時候,很多初學者會糾結於寫出的檔案出現亂碼的問題。 以下是有關序列化與反序列化的相關程式碼。 第一步:先建立相關的物件。package day02; import java.io.Serializable; impo
Protobuf-net在Unity中的序列化與反序列化
本篇中我們只講解如何在Unity中對Protobuf-net進行序列化(Serialize)與反序列化(Deserialize),關於Unity的socket網路通訊部分我們後續開篇。 首先去Protobuf-net的Google下載點下載protobuf-net類庫: 這裡用的是目前最新的protobuf
Java 中序列化與反序列化
一、 序列化和反序列化概念 Serialization(序列化)是一種將物件以一連串的位元組描述的過程;反序列化deserialization是一種將這些位元組重建成一個物件的過程。將程式中的物件,放入檔案中儲存就是序列化,將檔案中的位元組碼重新轉成物件就是反序列化。 二、 序列化和反序列化的必要性 當兩個程
Java IO-5 序列化與反序列化流
str ride log getname file urn turn objects transient 建一個Person類 1 package demo05; 2 3 import java.io.Serializable; 4 5 public cla
Java序列化與反序列化
setname [] 進制 方式 gets 創建 保存 ati 取數據 Java序列化與反序列化是什麽?為什麽需要序列化與反序列化?如何實現Java序列化與反序列化?本文圍繞這些問題進行了探討。 1.Java序列化與反序列化 Java序列化是指把Java對象轉換為字節序
asp.net mvc中如何處理字符串與對象之間的序列化與反序列化(一)
osi strong 類結構 plain pbo edate inf esc arp 前臺我們一般用ajax來發送數據到後端進行處理,如果json數據結構和後臺的實體類結構一致,就直接可以反序列化為指定的對象進行操作,非常方便。 前端發送的json數據結構: 後端實體結
Java將對象寫入文件讀出——序列化與反序列化
ansi print 成員 trace 對象的引用 ack lose 靜態 spa Java類中對象的序列化工作是通過ObjectOutputStream和ObjectInputStream來完成的。 寫入: 1 File aFile=new File(
01. Java對象的序列化與反序列化簡介
語音 log -c object height 通訊 圖片 二進制 進程 Java對象的序列化與反序列化 ; 給大家講解一下什麽是序列化 & 反序列化 當兩個進程進行遠程通訊的時候,彼此相互可以發送各種類型的數據,如文本,圖片,語音和視頻等無論是任何
python中的序列化與反序列化
tmp 數據類型 load 一個 port style pick 序列 spa 之前,在學習python時,一直弄不明白pickle和json模塊的序列化和反序例化之間的區別和用法,最近閑來有時間,重新研究了這兩個模塊,也算是基本搞明白他們之中的區別了。 用於序列化的兩個模