熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java序列化--java.io.Serializable接口解析

2013-11-23 19:06:21  來源: Java核心技術 

  使用java以來序列化隨處可見至於為什麼要用序列化序列化能解決什麼問題作為一個普通的碼農一般不怎麼會去深入研究由於最近在看mina和公司內部涉及到nio框架的一些源碼裡面涉及到hessionjava這兩種序列化至於hession序列化為什麼會誕生以及在apache項目中使用如此廣泛以及java本身序列化存在哪些缺陷甚是不解為了解答上面拋出來的疑惑以及進一步了解java的序列化機制這裡開個小頭從java的序列化接口Serializable開始說起

  jdk包裡的Serializable接口的注釋主要說明了以下幾點

  類通過實現Serializable接口來啟用序列化否則該類的任何狀態將無法被序列化同時也無法用於反序列化

  若繼承的父類沒有實現Serializable接口但是又想讓子類可序列化有三個注意事項

  a)子類實現Serializable接口

  b)子類必須有可訪問的無參構造方法用於保存和恢復父類的public或protected或同包下的package字段的狀態否則在序列化或反序列化時會拋出RuntimeException異常

  c)對於序列化後的子類在進行反序列化時理論上無法初始化父類中private(不可訪問)對象變量的狀態或值

  在對可序列化類中的屬性進行序列化時如果遇到不可序列化的對象變量此時會針對不可序列化的類拋出NotSerializableException異常

  對於可序列化的非數組類強烈建議顯示聲明static型long型final型serialVersionUID字段用於標識當前序列化類的版本號否則在跨操作系統跨編譯器之間進行序列化和反序列化時容易出現InvalidClassException異常

  對於可序列化類中的statictransient對象變量在序列化時無法保存其狀態或值static對象變量在反序列化時取得的值為當前jvm中對應類中對應static變量的值而transient(瞬態)關鍵字則一般用於標識那些在序列化時不需要傳遞的狀態變量

  簡單的測試代碼

   import javaioFileInputStream import javaioFileNotFoundException import javaioFileOutputStream import javaioIOException import javaioObjectInputStream import javaioObjectOutputStream import javaioSerializable

   /** * 序列化測試 * * @author sume * */ public class SerializableImpl implements Serializable {

   private static final long serialVersionUID = L

   static String staticVal = static transient String transientVal = transient String val = val

   /** * main */ public static void main(String[] args) throws FileNotFoundException IOException ClassNotFoundException { // 序列化 SerializableImpl sila = new SerializableImpl() ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(Serializabletxt)) objectOutputStreamwriteObject(sila objectOutputStreamclose()

   // 反序列化 SerializableImplstaticVal = static ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(Serializabletxt)) SerializableImpl sila = (SerializableImpl) objectInputStreamreadObject() objectInputStreamclose()

   // 比較各個屬性的值 Systemoutprintln(silastaticVal) Systemoutprintln(silatransientVal) Systemoutprintln(silaval) } }輸出結果 static null val從輸出結果可以看出

  反序列化後類中static型變量staticVal的值為當前jvm中對應static變量的值static而不是序列化時的值static

  transient關鍵字標識的變量的狀態並沒有在序列化中被保存因此反序列化後

  transientVal變量的值為null

  第三個為常見的對象狀態在序列化和反序列化過程中的傳遞

  簡單印證了前面所說的幾點內容


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26282.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.