1. 程式人生 > >物件流的使用以及序列化機制

物件流的使用以及序列化機制

物件的序列化

物件的序列化機制:

允許把記憶體中的java物件轉換成平臺無關的二進位制流,從而允許把這種二進位制流持久的儲存在磁碟上或通過網路將這種二進位制流傳輸到另一個網路節點,當其他程式獲取了這種二進位制流,就可以恢復成原來的Java物件

優點

將任何實現了Serializable介面的物件轉化為位元組資料,使其在儲存和傳輸時可被還原

序列化時RMI(Rmote Method Invoke – 遠端方法呼叫)過程的引數和返回值都必須實現的機制,而RMI是javaEE的基礎,因此序列化機制是javaEE平臺的基礎

某個物件支援序列化機制,必須讓其類可序列化,實現

Serializable

Externalizable

@Test
    public void test01(){
        Person p1 = new Person("小米", 24);
        Person p2 = new Person("小米", 24);
        ObjectOutputStream oos = null;
        try {
            oos  = new ObjectOutputStream(new FileOutputStream("person.txt"));
            oos.writeObject
(p1); oos.flush(); oos.writeObject(p2); oos.flush(); } catch (IOException e) { e.printStackTrace(); }finally { try { oos.close(); } catch (IOException e) { e.printStackTrace(); }
} } } class Person implements Serializable { String name; Integer age; public Person() { } public Person(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; }

物件的反序列化過程,將硬碟中的檔案通過ObjectInputStream轉換為相應的物件

  1. 類是可以序列化的,實現序列化介面
  2. 要求類的屬性要實現序列化介面
  3. 凡是實現Serializable介面的類,都有一個表示序列化版本識別符號的靜態變數

private static final long serialVersionUID;

serialVersionUID

表示類的不同版本鍵的相容性,如果類沒有顯示定義這個靜態變數,它的值是java執行時環境根據類的內部細節自動生成的,若類的原始碼做了修改,serialVersionUID可能發生變化,故建議顯式宣告

顯示定義serialVersionUID的用途

類的不同版本對序列化相容,因此需確保類的不同版本具有相同的serialVersionUID

不希望類的不同版本對序列化相容,因此需確保類的不同版本具有不同的serialVersionUID

在Person類中增加

private static final long serialVersionUID =1L;

讀取類的物件

@Test
public void testObjectInputStream(){
    ObjectInputStream ois = null;
    try {
        ois = new ObjectInputStream(new FileInputStream("person.txt"));
        Person p1 = (Person)ois.readObject();
        System.out.println(p1);
        Person p2 = (Person)ois.readObject();
        System.out.println(p2);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }finally {
        if (ois != null){
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

注意事項:

ObjectOutputStream和ObjectInputStream不能序列化static和teansient修飾的成員變數