序列化 (Serialization)是將對象的狀態資訊轉換為可以儲存或傳輸的形式的過程。一般將一個Object Storage Service至一個儲存媒介,例如檔案或是記億體緩衝等。在網路傳輸過程中,可以是位元組或是XML等格式。而位元組的或XML編碼格式可以還原完全相等的對象。這個相反的過程又稱為還原序列化。
Java對象的序列化與還原序列化
在Java中,我們可以通過多種方式來建立對象,並且只要對象沒有被回收我們都可以複用該對象。但是,我們建立出來的這些Java對象都是存在於JVM的堆記憶體中的。只有JVM處於運行狀態的時候,這些對象才可能存在。一旦JVM停止運行,這些對象的狀態也就隨之而丟失了。
但是在真實的應用情境中,我們需要將這些對象持久化下來,並且能夠在需要的時候把對象重新讀取出來。Java的對象序列化可以協助我們實現該功能。
對象序列化機制(object serialization)是Java語言內建的一種對象持久化方式,通過對象序列化,可以把對象的狀態儲存為位元組數組,並且可以在有需要的時候將這個位元組數組通過還原序列化的方式再轉換成對象。對象序列化可以很容易的在JVM中的使用中的物件和位元組數組(流)之間進行轉換。
在Java中,對象的序列化與還原序列化被廣泛應用到RMI(遠程方法調用)及網路傳輸中。
相關介面及類
Java為了方便開發人員將Java對象進行序列化及還原序列化提供了一套方便的API來支援。其中包括以下介面和類:
- java.io.Serializable
- java.io.Externalizable
- ObjectOutput
- ObjectInput
- ObjectOutputStream
- ObjectInputStream
- Serializable 介面
類通過實現 java.io.Serializable 介面以啟用其序列化功能。未實現此介面的類將無法使其任何狀態序列化或還原序列化。可序列化類別的所有子類型本身都是可序列化的。序列化介面沒有方法或欄位,僅用於標識可序列化的語義。 (該介面並沒有方法和欄位,為什麼只有實現了該介面的類的對象才能被序列化呢?)
當試圖對一個對象進行序列化的時候,如果遇到不支援 Serializable 介面的對象。在此情況下,將拋出NotSerializableException。
如果要序列化的類有父類,要想同時將在父類中定義過的變數持久化下來,那麼父類也應該整合java.io.Serializable介面。
下面是一個實現了java.io.Serializable介面的類
package com.hollischaung.serialization.SerializableDemos;import java.io.Serializable;/*** Created by hollis on 16/2/17.* 實現Serializable介面*/public class User1 implements Serializable {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}}
通過下面的代碼進行序列化及還原序列化
package com.hollischaung.serialization.SerializableDemos;import org.apache.commons.io.FileUtils;import org.apache.commons.io.IOUtils;import java.io.*;/*** Created by hollis on 16/2/17.* SerializableDemo1 結合SerializableDemo2說明 一個類要想被序列化必須實現Serializable介面*/public class SerializableDemo1 {public static void main(String[] args) {//Initializes The ObjectUser1 user = new User1();user.setName("hollis");user.setAge(23);System.out.println(user);//Write Obj to FileObjectOutputStream oos = null;try {oos = new ObjectOutputStream(new FileOutputStream("tempFile"));oos.writeObject(user);} catch (IOException e) {e.printStackTrace();} finally {IOUtils.closeQuietly(oos);}//Read Obj from FileFile file = new File("tempFile");ObjectInputStream ois = null;try {ois = new ObjectInputStream(new FileInputStream(file));User1 newUser = (User1) ois.readObject();System.out.println(newUser);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} finally {IOUtils.closeQuietly(ois);try {FileUtils.forceDelete(file);} catch (IOException e) {e.printStackTrace();}}}}//OutPut://User{name='hollis', age=23}//User{name='hollis', age=23}
以上就是本文的全部內容,希望對大家學習Java中對象序列化與還原序列化有所協助。