本資料來自於runoob,略有修改。html
整個過程都是 Java 虛擬機(JVM)獨立的,也就是說,在一個平臺上序列化的對象能夠在另外一個徹底不一樣的平臺上反序列化該對象。java
類 ObjectInputStream 和 ObjectOutputStream 是高層次的數據流,它們包含反序列化和序列化對象的方法。url
DEMOspa
示例對象類Employee.java.net
public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } }
一個類的對象要想序列化成功,必須知足兩個條件:code
該類必須實現 java.io.Serializable 接口。htm
該類的全部屬性必須是可序列化的。若是有一個屬性不是可序列化的,則該屬性必須註明是短暫的。對象
序列化對象blog
import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /tmp/employee.ser"); }catch(IOException i) { i.printStackTrace(); } } }
反序列化對象接口
import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); }catch(IOException i) { i.printStackTrace(); return; }catch(ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); } }
以上程序編譯運行結果以下所示:
Deserialized Employee... Name: Reyan Ali Address:Phokka Kuan, Ambehta Peer SSN: 0 Number:101
這裏要注意如下要點:
readObject() 方法中的 try/catch代碼塊嘗試捕獲 ClassNotFoundException 異常。
對於 JVM 能夠反序列化對象,它必須是可以找到字節碼的類。若是JVM在反序列化對象的過程當中找不到該類,則拋出一個 ClassNotFoundException 異常。
注意,readObject() 方法的返回值被轉化成 Employee 引用。
當對象被序列化時,屬性 SSN 的值爲 111222333,可是由於該屬性是短暫的,該值沒有被髮送到輸出流。因此反序列化後 Employee 對象的 SSN 屬性爲 0。