1. 程式人生 > >Java序列化(Serialize)和反序列化(Deserialize)

Java序列化(Serialize)和反序列化(Deserialize)

物件的序列化

一、目的:
將物件轉換成與平臺無關的二進位制流,從而可以儲存到磁碟或者進行網路傳輸,其它程式獲 得這個二進位制流後可以將其還原成物件。
序列化機制可以使物件可以脫離程式的執行而對立存在。
————————————————————————————————————————
二、是什麼?
序列化(Serialize)指將一個java物件寫入IO流中,與此對應的是,物件的反序列化(Deserialize)則指從IO流中恢復該java物件。

————————————————————————————————————————
三、如何實現物件的序列化

要實現物件的序列化,必須讓它的類實現序列化,可以通過實現Serializable介面。   

特別:1) Serializable介面中並沒有需要實現的方法,它的作用僅僅是一個標記,表示實現            它的類是可序列化的。諸如像Serializable這種沒有方法的介面,我們一般稱之為             標記介面。
     2)一定要新增序列化版本號(serialVersionUID)
     3)一個類中可能有很多的成員變數,有些我不想進行序列化。請問該怎麼辦呢?
   使用transient關鍵字宣告不需要序列化的成員變數

————————————————————————————————————————
四、將物件寫入檔案

1)建立物件輸出流物件
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
2)建立可序列化類的物件
   Student s = new Student("張三",15);
3) 將物件寫入檔案 
  oos.writeObject(s);
4)關閉資源
   oos.close();

應該注意的問題:
* ObjectOutputStream 的構造方法,需要藉助一個位元組輸出流,並可能存在IOException。

           public ObjectOutputStream(OutputStream out)throws IOException

 * 在執行oos.writeObject(s)時,可能丟擲以下異常:
      ** InvalidClassException  
         可能的原因: 
          <*>該類的序列版本號與從流中讀取的類描述符的版本號不匹配 
          <*>該類包含未知資料型別 
          <*>該類沒有可訪問的無引數構造方法 
      ** NotSerializableException   類未實現Serializable介面
      ** IOException 

———————————————————————————————————————
五、檔案中讀取資料,並轉換物件

        // 建立反序列化物件
      ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
        // 還原物件
        Object obj = ois.readObject();
        // 釋放資源
        ois.close();
                // 輸出物件
        System.out.println(obj);

應該注意的問題:

   * 在執行ois.readObject();的時候可能丟擲IOException, ClassNotFoundException

   * 得到的obj不需要強轉為Student就可以直接輸出。