【Java】第四十節 IO流之對象流

對象序列化機制:

對象序列化機制允許把內存中的Java對象轉換成平臺無關的二進制流,從而允許把這種二進制流持久地保存在磁盤上,或通過網絡將這種二進制流傳輸到另一個網絡節點。當其它程序獲取了這種二進制流,就可以恢復成原來的Java對象。

對象序列化的條件:

1、實現Serializable;
2、定義全局常量private static final long serialVersionUID;
3、除了當前Person類需要實現Serializable接口之外,還必須保證其內部所有屬性也都是可序列化的;(默認情況下,基本數據類型可序列化)
4、類中定義的用static和transient修飾的變量不能被序列化。

serialVersionUID的作用:

Java的序列化機制是通過在運行時判斷字節流中的 serialVersionUID與本地相應實體類的serialVersionUID來驗證該類版本的一致性的;
如果沒有顯示定義serialVersionUID,則程序會自動生成一個serialVersionUID,序列化後到反序列化前期間如果對類做了修改,那麼會導致本地相應的實體類的serialVersionUID發生變化,從而與字節流中的 serialVersionUID不相同;
在進行反序列化時,JVM會把傳來的字節流中的 serialVersionUID與本地相應實體類的serialVersionUID進行比較,如果相同就認爲是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常。(InvalidCastException)

對象流:ObjectInputStream和OjbectOutputSteam

用於存儲和讀取基本數據類型數據或對象的處理流,它的強大之處就是可以把Java中的對象寫入到數據源中,也能把對象從數據源中還原回來。

  • 序列化:用ObjectOutputStream類保存基本類型數據或對象的機制;
  • 反序列化:用ObjectInputStream類讀取基本類型數據或對象的機制;
  • ObjectOutputStream和ObjectInputStream同樣不能序列化static和transient修飾的成員變量。
例:

將下面的實體類用對象流實現序列化與反序列化:

class Person implements Serializable{

    private static final long serialVersionUID = 1231242L;
    private String name;
    private int age;
    private String gender;

    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    //此處省略get/set方法

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

ObjectOutputStream測試類:

package cn.jingpengchong.io;

import java.io.*;

public class ObjectStreamTest {
    public static void main(String[] args) {
        testObjectOutputStream();
    }

    private static void testObjectOutputStream() {

        ObjectOutputStream output = null;
        try {
            output = new ObjectOutputStream(new FileOutputStream("object.dat"));
            output.writeObject(new Person("孫悟空",520,"男"));
            //將緩存區的數據刷新到輸出流中
            output.flush();
            System.out.println("操作成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(output != null){
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

運行結果如下:
在這裏插入圖片描述
ObjectInputStream測試類:

package cn.jingpengchong.io;

import java.io.*;

public class ObjectStreamTest {
    public static void main(String[] args) {
        testObjectInputStream();
    }

    private static void testObjectInputStream() {
        ObjectInputStream input = null;
        try {
            input = new ObjectInputStream(new FileInputStream("object.dat"));
            Person per = (Person)input.readObject();
            System.out.println(per);
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            if(input != null){
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

運行結果如下:
在這裏插入圖片描述

發佈了126 篇原創文章 · 獲贊 16 · 訪問量 2487
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章