對象序列化,就是把一個對象變爲二進制的數據流的一種方法,如圖16-24所示,通過對象序列化可以方便的實現對象的傳輸或存儲。
一個類的對象想被序列化,則對象所在的類必須實現java.io.Serializable接口。然而此接口並沒有提供任何的抽象方法,所以該接口是一個標識接口,只是表示一種對象可以被序列化的能力。
範例:定義序列化對象類
package com.lxh.sixteenchapter;
import java.io.Serializable;
public class Member430 implements Serializable {
private String name;
private int 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 Member430(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名"+this.name+"年齡"+this.age;
}
}
對象序列化與反序列化
對象序列化和反序列化的具體實現,依靠ObjectOutputStream與ObjectInputStream兩類完成
ObjectOutputStream類可以將對象轉爲特定格式的二進制數據輸出,ObjectInputStream類可以讀取ObjectOutputStream類輸出的二進制對象數據,並將其轉爲具體類型的對象返回。
ObjectOutputStream常用方法
ObjectInputStream常用方法
範例:實現對象序列化和反序列化操作
package com.lxh.sixteenchapter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class javaIODemo432 {
//本次操作要將序列化的對象保存到文件中,將文件定義爲公共常量
private static final File SAVE_FILE=new File("E:"+File.separator+"File"+File.separator+"1.txt");
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
saveObject(new Member430("小李",18)); //對象序列化
System.out.println(loadObject()); //反序列化
}
private static Object loadObject() throws FileNotFoundException, IOException, ClassNotFoundException {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(SAVE_FILE));
Object obj=ois.readObject(); //反序列
ois.close();
return obj;
}
private static void saveObject(Object obj) throws FileNotFoundException, IOException {
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
oos.writeObject(obj); //序列化
oos.close();
}
}
執行結果
序列化:會轉換爲二進制數據
反序列化
姓名小李年齡18
transient關鍵字
transient可以使某些成員屬性不進行序列化
默認情況下,當執行對象序列化的時候,會將類中的全部屬性進行序列化操作,但有一些屬性不需要進行序列化操作(例如動態需要計算的),這個時候就可以使用transient關鍵字來完成。沒有序列化的屬性在反序列化時讀取的數據類型爲默認操作。例如name爲null。
@SuppressWarnings("serial") // 序列化需要有一個序列化編號,該編號編譯時可以自動生成
class Member implements Serializable {
private transient String name ;// 此屬性不被序列化
private int age ;
// 其它相同代碼略 ...
}