一 點睛
在預設情況下,當一個類對象序列化時,會将這個類之中的全部屬性都儲存下來,如果不希望類中的某個屬性被序列化(或某些屬性不希望被儲存),則可以在聲明屬性之前加上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