做的項目中要用到日志功能,記錄重要數據增刪改,以提供后臺動態數據恢復功能,在數據庫中建立一個表四個字段:
id:標識(long)、action:增刪改類別(String 或 int)、olddata與newdata分別記錄增刪改前后的數據類型為blob、optime記錄操作時間
項目持久層用了Hibernate所以數據庫中所有條目都是以JavaBean形式出現,JavaBean擴展了Serializable可以實現對象的序列化,現在問題就是怎樣保存JavaBean序列化的結果到數據庫,并且可以逆向反序列化為實例。

因為剛接觸Java對列的概念不是很清楚,所以在序列化上遇到了問題,首先是如何不通過臨時文件取得對象序列化的結果,網上的例子大多是對文件流的操作,用來保存圖片
綜合網上的多個例子以及從JDK中查詢的結果,總結出以下過程:
1、還是對流的操作,不過不是文件流而是字節流,利用ByteArrayOutputStream創建
2、通過new出來ByteArrayOutputStream作為參數創建ObjectOutputStream
3、調用ObjectOutputStream的writeObject將任意JavaBean序列化為字節流
//以上是序列化過程,實際上使用不同的XStream就可以把JavaBean序列化到不同的流中
4、通過調用ByteArrayOutputStream的toByteArray可以獲得byte數組
//這是取中間值,相當于文件流操作時利用文件名打開一個文件流,文件名也是一個中間值
5、將得到的byte數組作為參數用ByteArrayInputStream打開一個輸入流
6、調用靜態方法Hibernate.createBlob(),以輸入流為參數獲取Blob
7、此后可將該Blob設置為接收Bean的屬性保存到數據庫中
//以上完成將序列化的結果存儲到數據庫
8、利用Hibernate的API的到數據庫中的Blob很容易,然后調用Blob的getBinaryStream可獲取輸入流,將此流作為ObjectInputStream,調用readObject可得到序列化前的實例
代碼:
//序列化
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(new User("cfgxy"));
//保存到數據庫,sessionFactory是Hibernate中SessionFactory的一個實例
Session session=sessionFactory.createSession();
Transaction tx =session.openTransaction();
ByteArrayInputStream bis=new ByteArrayInputStream(bos.getByteArray());
session.save(new Logs(null,"INSERT",null,Hibernate.createBlob(bis)));
tx.commit();
session.close();
//從數據庫讀取,假設傳來的參數id為數據庫主鍵的值
Session session=sessionFactory.createSession();
Logs log=(Logs)session.load(Logs.class,id);
ObjectInputStream ois=new ObjectInputStream(log.getNewData().getBinaryStream());
return (User)ois.readObject();
//代碼中均未對異常進行捕捉,實際運用中要捕捉異常


文章來源:http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!818.entry