天天看點

序列化中transient實戰

一 點睛

在預設情況下,當一個類對象序列化時,會将這個類之中的全部屬性都儲存下來,如果不希望類中的某個屬性被序列化(或某些屬性不希望被儲存),則可以在聲明屬性之前加上transient關鍵字。

二 實戰

1 準備Person類

import java.io.Serializable;
public class Person implements Serializable
{                                         // 此類的對象可以被序列化
    public static final long serialVersionUID = 42L;
    private String name;                // 聲明name屬性,将改屬性變成包屬性
    transient private int age;                    // 聲明age屬性
    String country = "cn";
    public Person(String name, int age ,String country)
    {                                    // 通過構造方法設定屬性内容
        this.name = name;
        this.age  = age;
        this.country = country;
    }

    public String toString()
    {                                    // 覆寫toString()方法
        return "姓名:" + this.name + ";年齡:"
                        + this.age + ";國籍:" + this.country;
    }
}
           

2 準備序列化類

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class SerDemo01
{
    public static void main(String[] args) throws Exception
    {
        File f = new File("SerTest.txt");
        ObjectOutputStream oos = null;
        OutputStream out = new FileOutputStream(f);    // 檔案輸出流
        oos = new ObjectOutputStream(out);          // 為對象輸出流執行個體化
        oos.writeObject(new Person("Tom", 25, "America"));  // 儲存對象到檔案
        oos.close();                                        // 關閉輸出
    }
}
           

3 準備反序列化類

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;

public class SerDemo02
{
    public static void main(String[] args) throws Exception
    {
        File f = new File("SerTest.txt");
        ObjectInputStream ois = null;
        InputStream input = new FileInputStream(f);    // 檔案輸入流
        ois = new ObjectInputStream(input);     // 為對象輸出流執行個體化
        Object obj = ois.readObject();          // 讀取對象
        ois.close();                            // 關閉輸出
        System.out.println(obj);
    }
}
           

4 編譯運作序列化和反序列化

E:\Java\Java程式設計技術大全\範例源碼、實戰練習答案、贈送資源\範例源碼\chap17\範例17-3>javac Person.java
E:\Java\Java程式設計技術大全\範例源碼、實戰練習答案、贈送資源\範例源碼\chap17\範例17-3>javac SerDemo01.java
E:\Java\Java程式設計技術大全\範例源碼、實戰練習答案、贈送資源\範例源碼\chap17\範例17-3>javac SerDemo02.java
E:\Java\Java程式設計技術大全\範例源碼、實戰練習答案、贈送資源\範例源碼\chap17\範例17-3>java SerDemo01
E:\Java\Java程式設計技術大全\範例源碼、實戰練習答案、贈送資源\範例源碼\chap17\範例17-3>java SerDemo02
姓名:Tom;年齡:0;國籍:America
           

5 說明

從輸出結果可以看到,Person類中的age并沒有被儲存下來,輸出這個屬性時,輸出的是0,如果是String類型,預設會輸出null