Java serialization 意味著將對像轉換為字節序列,以便可以存儲在文件中或通過網絡傳輸,並在需要時重新創建對象。在進行序列化時,對象的狀態信息被保存到文件或流中,例如Byte Stream或Disk, 這樣便可以在需要時通過反序列化將其轉換回原始狀態。Java序列化允許將任何對像保存到存儲器中,以便稍後反序列化時使用。Java提供了Serializable接口,所有類都通過實現此接口來啟用序列化和反序列化操作。
Java Deserialization 是將字節流轉換回對象的過程。在執行反序列化時,文件中的原始字節被讀取,並將其轉換成對應的Java對象。反序列化過程是反向處理對像序列化的過程,先從粘貼板中獲取序列化的內容,然後被反序列化成Java對象。
舉個例子,假設有一個名為Person的類,其中包含name, age和address屬性。如下例所示:
import java.io.*;
public class Person implements Serializable {
private String name;
private int age;
private String address;
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String toString() {
return "Name: " + name + ", Age: " + age + ", Address: " + address;
}
}
現在可以將此類實例化並將其序列化為文件或字節中。假設有一個Person對象,將其寫入文件ser_file.ser中,如下所示:
import java.io.*;
public class SerializationDemo {
public static void main(String[] args) {
try {
Person obj = new Person("John", 30, "New York");
// Serialize the object
FileOutputStream file = new FileOutputStream("ser_file.ser");
ObjectOutputStream out = new ObjectOutputStream(file);
out.writeObject(obj);
out.close();
file.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
現在,我們可以從ser_file.ser文件中讀取對象並將其反序列化回Person對象,如下所示:
import java.io.*;
public class DeserializationDemo {
public static void main(String[] args) {
try {
// Deserialize the object
FileInputStream file = new FileInputStream("ser_file.ser");
ObjectInputStream in = new ObjectInputStream(file);
Person obj = (Person)in.readObject();
in.close();
file.close();
System.out.println(obj.toString());
} catch(IOException e) {
e.printStackTrace();
} catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
}
此時,程序將輸出以下內容:
Name: John, Age: 30, Address: New York
以下是 Java serialization 和 deserialization 的重點:
請問當使用Java Serialization進行物件序列化時,我們可以使用哪些方法來自訂序列化行為?
答案:我們可以實作Serializable介面中的writeObject和readObject方法來自訂序列化和反序列化。
請問當進行Java Deserialization時,若被序列化的類別不再classpath中,會發生什麼錯誤?
答案:當無法找到被序列化類別時,會拋出ClassNotFoundException。
請問當序列化一個物件時,若物件中有參考到其他物件怎麼辦?
答案:序列化器會遞迴地序列化整棵物件圖。
請問在反序列化一個物件時,若物件中有參考到其他物件怎麼辦?
答案:反序列化器會遞迴地反序列化整棵物件圖。
請問被序列化的Java物件需要滿足哪些條件?
答案:被序列化的Java物件必須實作Serializable介面,且其所有成員變數必須是可序列化的。如果成員變數不滿足可序列化條件,可在成員變數上加上transient關鍵字來暫時避免序列化。