Java序列化(Serialize)和反序列化(Deserialize)
阿新 • • 發佈:2019-02-04
物件的序列化
一、目的:
將物件轉換成與平臺無關的二進位制流,從而可以儲存到磁碟或者進行網路傳輸,其它程式獲 得這個二進位制流後可以將其還原成物件。
序列化機制可以使物件可以脫離程式的執行而對立存在。
————————————————————————————————————————
二、是什麼?
序列化(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就可以直接輸出。