用於存儲和讀取基本數據類型數據或對象的處理流,能夠把Java中的對象寫入到數據源中,也能把對象從數據源中還原回來java
注意:ObjectOutputStream和ObjectInputStream不能序列化static和transient修飾的成員變量網絡
對象序列化機制容許把內存中的Java對象轉換成平臺無關的二進制流,從而容許把這種二進制流持久地保存在磁盤上,或經過網絡將這種二進制流傳輸到另外一個網絡節點。當其它程序獲取了這種二進制流,就能夠恢復成原來的Java對象ui
若是須要讓某個對象支持序列化機制,該類必須實現以下兩個接口之一,不然,會拋出NotSerializableException異常this
須要當前類提供一個全局常量serialVersionUID版本控制
public static final long serialVersionUID = 4892322646L;code
其中數值沒有嚴格要求,隨便寫一個便可對象
內部全部屬性也必須是可序列化的(默認狀況下,基本數據類型和String是可序列化的)blog
若是某個類的屬性不是基本數據類型或 String 類型,而是另外一個引用類型,那麼這個引用類型必須是可序列化的(實現Serializable接口),不然擁有該類型的Field 的類不能序列化接口
使用ObjectOutputStream來實現內存
public void test1(){ //序列化過程:將內存中的java對象保存在磁盤中或經過網絡傳輸出去 ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("object.dat")); oos.writeObject(new String("我愛北京天安門")); oos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if(oos != null) oos.close(); } catch (IOException e) { e.printStackTrace(); } } }
使用ObjectInputStream來實現
public void test2(){ //反序列化過程:將磁盤文件中對象還原爲內存中的一個java對象 ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream("object.dat")); Object object = ois.readObject(); String s = (String) object; System.out.println(s); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if(ois != null) ois.close(); } catch (IOException e) { e.printStackTrace(); } } }
注意自定義類必定要實現Serializable接口和有一個全局變量serialVersionUID
public class Person implements Serializable { public static final long serialVersionUID = 4892322646L; private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = 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; }
public void test1(){ //序列化過程:將內存中的java對象保存在磁盤中或經過網絡傳輸出去 ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("object.dat")); oos.writeObject(new String("我愛北京天安門")); oos.flush(); oos.writeObject(new Person("殷志源",42)); oos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if(oos != null) oos.close(); } catch (IOException e) { e.printStackTrace(); } } }
public void test2(){ //反序列化過程:將磁盤文件中對象還原爲內存中的一個java對象 ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream("object.dat")); Object object = ois.readObject(); String s = (String) object; Person p = (Person) ois.readObject(); System.out.println(s); System.out.println(p); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if(ois != null) ois.close(); } catch (IOException e) { e.printStackTrace(); } } }
至關於一個標識
目的是以序列化對象進行版本控制,有關各版本反序列化時是否兼容
若是對類進行了修改,可是定義了serialVersionUID,反序列化的時候依舊能夠識別出其內容
若是類沒有顯示定義這個靜態常量,它的值是Java運行時環境根據類的內部細節自動生成的。若類的實例變量作了修改,serialVersionUID可能發生變化。因此須要顯示聲明