1. 程式人生 > >Java資料通訊中使用Google Protobuf實現序列化與反序列化

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檔案:

  1. option java_package = "com.proto";   
  2. option java_outer_classname = "FirstProtobuf";   
  3. message TestBuf  {   
  4.   required int32 ID = 1;   
  5.   required string Url = 2;   
  6. }  
2、利用protoc.exe 生成java檔案:
  1. protoc.exe --java_out=./ test.proto  
3、編寫測試類:
  1. package com.test;  
  2. import java.io.IOException;  
  3. import com.proto.FirstProtobuf;  
  4. import com.proto.FirstProtobuf.TestBuf;  
  5. publicclass TestProtoBuf {  
  6.     publicstaticvoid main(String[] args) throws IOException {  
  7.         //序列化過程 
  8.         //FirstProtobuf是生成類的名字,即proto檔案中的java_outer_classname 
  9.         //testBuf是裡面某個序列的名字,即proto檔案中的message testBuf 
  10.         FirstProtobuf.TestBuf.Builder builder = FirstProtobuf.TestBuf.newBuilder();  
  11.         builder.setID( 123 );  
  12.         builder.setUrl("http://www.21cn.com");  
  13.         TestBuf info = builder.build();  
  14.         byte[] buf = info.toByteArray();  
  15.         TestBuf tb = TestBuf.parseFrom(buf);  
  16.         System.out.println( tb.getID());  
  17.         System.out.println( tb.getUrl());  
  18.     }  
  19. }  

相關推薦

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模塊的序列化和反序例化之間的區別和用法,最近閑來有時間,重新研究了這兩個模塊,也算是基本搞明白他們之中的區別了。 用於序列化的兩個模