2008-10-03

Java Type vs PostgreSQL Type (十四) 序列化資料之對應

序列化資料:
在測試序列化資料時,先在資料庫建置一張資料表。
資料表語法:
CREATE TABLE serialtypes
(
serial bytea,
id serial NOT NULL,
CONSTRAINT serialtypes_pkey PRIMARY KEY (id)
)
原始程式碼:
JavaSerializableType.java:
package zasax.type.binarytypes;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import zasax.conn.PostgreConnection;
import zasax.sample.SampleData;
import zasax.serial.SerializableFlow;
/**
*
* @author YiCheng,Hsiao
*/

public class JavaSerializableType {
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;
private String setSQL = "Insert into serialtypes (serial) values (?)";
private String getSQL = "select * from serialtypes";
public static void main(String[] args)
throws IOException, ClassNotFoundException, SQLException {
SerializableFlow sf = new SerializableFlow();
JavaSerializableType jst = new JavaSerializableType();
SampleData sd = new SampleData();
sd.setStr("這是個序列化檔案的測試。");
SampleData sd1;
ByteArrayOutputStream baos =
(ByteArrayOutputStream) sf.serializeToByte(sd);
jst.setSerializableValue(
new ByteArrayInputStream(baos.toByteArray()), baos.toByteArray().length);
ResultSet rs = jst.getSerializableValue();
while (rs.next()) {
sd1 = (SampleData) sf.decodeSerializableValue(rs.getBytes("serial"));
System.out.println(sd1.getStr());
}
}
public void setSerializableValue(InputStream is, int length)
throws IOException, ClassNotFoundException, SQLException {
PostgreConnection pc = new PostgreConnection();
this.conn = pc.getConnection();
this.pstmt = conn.prepareStatement(setSQL);
pstmt.setBinaryStream(1, is, length);
pstmt.execute();
pstmt.close();
conn.close();
}
public ResultSet getSerializableValue()
throws IOException, ClassNotFoundException, SQLException {
PostgreConnection pc = new PostgreConnection();
this.conn = pc.getConnection();
this.pstmt = conn.prepareStatement(getSQL);
this.rs = pstmt.executeQuery();
return rs;
}
}
SerializableFlow.java:
package zasax.serial;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
/**
*
* @author YiCheng,Hsiao
*/

public class SerializableFlow {
public OutputStream serializeToByte(T toSerializableValue)
throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(toSerializableValue);
return baos;
}
public T decodeSerializableValue(byte[] getSerializbleValue)
throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(
new ByteArrayInputStream(getSerializbleValue));
return (T) ois.readObject();
}
}
SampleData.java:
package zasax.sample;
import java.io.Serializable;
/**
*
* @author YiCheng,Hsiao
*/

public class SampleData implements Serializable {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
實際測試程序:
儲存序列化資料的方式:
先建置一個範例資料物件:SampleData,並set一個字串作為存取資料,再透過Serializable中的serializeToByte方法,將SampleData物件傳入序列化轉成二進制資料(baos(ByteArrayOutputStream)),再將這筆二進制資料回傳給bais(ByteArrayInputStream)承接,不過承接前要將baos透過toByteArray()的方法轉成byte[],再放置到bais,再經由setSerializableValue()這個方法,將bais傳入,再由setBinaryStream()存到資料庫。

讀取序列化資料的方式:
在getSerializableValue()這個方法,透過excuteQuery()這個方法,將SQL語法:"select * from serialtypes ",將資料表資料傳回給ResultSet,再回傳至main()區塊的ResultSet rs 承接,再由rs.getByte()將欄位的資料讀出,作為sf.decodeSerialzableValue()的傳入參數,經過解序列化的方式,將二進制資料轉回成原物件(SampleData),再將SampleData回傳至給SampleData sd1此物件承接。要驗證是否為SampleData的物件,先前再存入資料庫前,有set一串字串,所以透過getStr()的方式,驗證是否跟存入的字串相同。
印出的結果:
整理表格如下:

Java Types

PostgreSQL Types

特性

SerializableData

(SampleData(Object))

bytea

4 bytes加上實際的二進制字串,變長的二進制字串

沒有留言:

網誌存檔

PostgreSQL & Google-Analytics Running...

::Planet PostgreSQL::

PostgreSQL Information Page

PostgreSQL日記(日本 石井達夫先生Blog)

PostgreSQL News

黑喵的家 - 資料庫相關

Google 網上論壇
PostgreSQL 8 DBA 專業指南中文版
書籍內容討論與更多下載區(造訪此群組)
目錄下載: PostgreSQL_8 _DBA_Index_zh_TW.pdf (更新:2007-05-18)

全球訪客分佈圖(Google)

全球訪客分佈圖(Google)