public interface Serializable { }Serializable 介面是一個空介面,實現該介面無須實現任何方法,它只是告訴 JVM 該類可以被序列化機制處理。通常建議程式建立的每個 JavaBean 類都實現 Serializable。
public ObjectOutputStream (OutputStream out)
該構造方法需要傳入一個 OutputStream 物件,用來表示將物件二進位制流寫入到指定的 OutputStream 中。
// 建立個 ObjectOutputStream 輸出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
// 將一個 Person 物件輸出到輸出流中
oos.writerObject(per);
import java.io.Serializable; public class Person implements Serializable { private String name; private int age; // 注意此處沒有提供無引數的構造器 public Person(String name, int age) { System.out.println("有引數的構造器"); this.name = name; this.age = age; } // 省略 name 和 age的setter和getter方法 ... }注意:Person 類的兩個成員變數分別是 String 型別和 int 型別的。如果某個類的成員變數的型別不是基本型別或 String 型別,而是另一個參照型別,那麼這個參照型別必須是可序列化的,否則擁有該型別成員變數的類也是不可序列化的。
public class WriteObject { public static void main(String[] args) throws Exception { // 建立一個 ObjectOutputStream 輸出流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt")); Person per = new Person("C語言中文網", 7); // 將 Per物件寫入輸出流 oos.writeObject(per); } }上面程式中的第 4 行程式碼建立了一個 ObjectOutputStream 輸出流,這個 ObjectOutputStream 輸出流建立在一個檔案輸出流的基礎之上。程式第 7 行程式碼使用 writeObject() 方法將一個 Person 物件寫入輸出流。執行上面程式,將會看到生成了一個 object.txt 檔案,該檔案的內容就是 Person 物件。
public ObjectInputStream(InputStream out)
該構造方法需要傳入一個 InputStream 物件,用來建立從指定 InputStream 讀取的 ObjectInputStream。
// 建立一個ObjectInputStream輸入流
ObjectInputStream ois = new ObjectInputStream (new FileInputStream ("object. txt"));
// 從輸入流中讀取一個Java物件,並將其強制型別轉換為Person類
Person P = (Person)ois.readObject();
public class ReadObject { public static void main(String[] args) throws Exception { // 建立一個ObjectInputStream輸入流 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt")); // 從輸入流中讀取一個 Java物件,並將其強制型別轉換為Person類 Person p = (Person) ois.readObject(); System.out.println("名字為:" + p.getName() + "n年齡為:" + p.getAge()); } }上面程式中第 4 行粗體字程式碼將一個檔案輸入流包裝成 ObjectInputStream 輸入流,第 6 行程式碼使用 readObject() 讀取了檔案中的 Java 物件,這就完成了反序列化過程。
當一個可序列化類有多個父類別時(包括直接父類別和間接父類別),這些父類別要麼有無引數的構造方法,要麼也是可序列化的,否則反序列化時將丟擲 InvalidClassException 異常。如果父類別是不可序列化的,只是帶有無引數的構造方法,則該父類別中定義的成員變數值不會序列化到 IO 流中。如果使用序列化機制向檔案中寫入了多個 Java 物件,使用反序列化機制恢復物件時必須按實際寫入的順序讀取。