java中使用Protobuf的實例(Demo)

由於Protobuf受到推崇,故嘗試採用protobuf來摒棄傳統的xml進行傳輸數據。


首先,需要下載的關於Protobuf的文件:

1.到http://code.google.com/p/protobuf/downloads/list ,選擇其中的win版本下載,我選擇的是protoc-2.4.1-win32.zip

2.下載一個protobuf-java-2.4.1.jar文件(注意,要與你剛纔下的proto.exe版本相同)

然後就開始開發了。

步驟:
1.用記事本編寫一個.proto文件:
}如:我編寫的是test.proto

package protobuf;
option java_package = "com.sq.protobuf";
option java_outer_classname = "FirstProtobuf";
message testBuf  {
  required int32 ID = 1;
  required string Url = 2;
}

將其放在與剛解壓的protoc.exe同級目錄中。

2.
在cmd中,到protoc-2.4.1-win32文件夾下,
執行
E:\protoc-2.4.1-win32> protoc.exe --java_out=./ test.proto
則可以找到的一個生成的FirstProtobuf.java文件。


3.

在MyEclipse中新建一個java project,建立包com.sq.protobuf,然後將剛纔生成的FirstProtobuf.java文件放在其下面。

此時會報錯,因爲沒有引入jar包,在package視圖下,將protobuf-java-2.4.1.jar引入,即可解決問題。


4.

建立測試文件:


package com.sq.protobuf.test;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import com.google.protobuf.InvalidProtocolBufferException;
import com.sq.protobuf.FirstProtobuf;

public class Test {
public static void main(String[] args) {

//序列化過程
//FirstProtobuf是生成類的名字,即proto文件中的java_outer_classname
//testBuf是裏面某個序列的名字,即proto文件中的message testBuf
FirstProtobuf.testBuf.Builder builder=FirstProtobuf.testBuf.newBuilder();
builder.setID(777);
builder.setUrl("shiqi");

//testBuf
FirstProtobuf.testBuf info=builder.build();

byte[] result = info.toByteArray() ;

String driver = "oracle.jdbc.driver.OracleDriver";
        String url = "jdbc:oracle:thin:@10.64.59.12:1521/orcl";
        String user = "parkingsystem"; 
        String password = "parkingsystem";
        try {
         Class.forName(driver);
        Connection conn = DriverManager.getConnection(url, user, password);

        if(!conn.isClosed()){
         System.out.println("Succeeded connecting to the Database!");
          
         //此處只能使用prepareStatement
         PreparedStatement ps = conn.prepareStatement("insert into test(id,test) values (1,?)");
        
         //寫入數據庫,要把它改寫爲流的形式
         ByteArrayInputStream stream =  new ByteArrayInputStream(result);
         ps.setBinaryStream(1,stream,stream.available());
         Statement statement = conn.createStatement();
          
         Blob blob = null;
         ps.execute();
        
         ////////////////上述完成將寫入數據庫的操作,數據庫中對應的字段的屬性要設置爲Blob         
        
         String sql = "select test from test";
         ResultSet rs = statement.executeQuery(sql);
         if(rs.next()){
         blob = rs.getBlob("test");
         }
          
         byte[] s = blob.getBytes(1,(int)blob.length());
          
         FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(s);
         System.out.println(testBuf);
         conn.close();
        }
         }catch(Exception e) {
          e.printStackTrace();
         }

//反序列化過程
try {
FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(result);
System.out.println(testBuf);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}

}
}


發現可以將其序列化,插入到數據庫,並可以從數據庫出取出後,反序列化,內容可以正常顯示出來。


注意的就是2點:

1.不能用statement,否則無法插入blob類型的數據

2.爲參數賦值時,要用

ByteArrayInputStream stream =  new ByteArrayInputStream(result);
ps.setBinaryStream(1,stream,stream.available());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章