2010年3月22日 星期一

JAVA Serializable

介紹序列化:
當你儲存你目前物件的資訊, 在 J2SE 中可用 java.io.Serializable (序列化)介面將物件寫到檔案中,只後可再反序列化, 可重建此物件.

原理:
序列化會將類別名與欄位寫到檔案中, 而寫的順序是從父類別寫起, 建立一個序列樹.
解序列化(deserializable)會檢查 class name, version UID, member, 只有三個條件相同才會做解序動作.

應用地方:
可用在 Web 上, 例如: Sever 先幫使用者建立資訊, 在傳給 Client 作後續的工作.


使用方法:
1. It is a interface, so your object need implement it .
2. 如果有些重要或敏感資訊, 或沒實作 serializable 成員, 若要被乎略, 可用 transient (暫短的) 在權限與物件前. 如 private transientint a
3. 如果物件只有些微變化, 可用設定 serailVersionUID, 其型態為 private static final long serialVersionUID = -8985932517290729708L; 而 jdk command 提供 serialver 方式建立一個唯一的 UID (當然你也可以自己建), 下 serialver -classpath your_tar -show , 跳出GUI 視窗, 輸入你的物件如, Test.Andy.TestSerial. 運作方式只要兩端有設定相同的 UID 則解序列化將他們視為相同. [2]



錯誤訊息與解決:
1. java.io.NotSerializableExceptionorg.apache.activemq.ActiveMQConnection. solution: add the transient modify

2. java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
原因: 這是 object input stream 讀取到不正確的資料型態產生. 以我的例子說, 因為我是用 Scanner 字元方式去下載一個 serial object, 而 serial object 卻是以位元方式儲存, 導致讀取時產生不正型態.
解決: 使用 BufferedInputStream 讀取位元資料

3. serivalUID 不相同. 因為自己在某個類別設定了 UID, 但卻沒有更改到所有JAR 檔, 因此產生. 解決重包 JAR 檔, 並將 UID 拿掉.






Reference:
http://funkie921.blogspot.com/2009/04/java-keyword-trancient.html
[2]http://java.sun.com/j2se/1.4.2/docs/tooldocs/solaris/serialver.html
http://java.sun.com/j2se/1.4.2/docs/api/java/io/ObjectInputStream.html
http://java.sun.com/j2se/1.4.2/docs/api/java/io/ObjectOutputStream.html
java.IO 中文教學 http://my.so-net.net.tw/idealist/Java/IO.html

沒有留言:

張貼留言