Posted on 2009-05-24 22:44
啥都寫點 閱讀(236)
評論(0) 編輯 收藏 所屬分類:
J2SE
關鍵技術:
- 當被序列化的對象實現了java.io.Externalizable接口時,就可以靈活地控制它的序列化和反序列化過程。java.io.Externalizable接口繼承了java.io.Serializable。
- Externalizable接口定義了兩個接口:writeExternal方法在序列化時被調用,可以在該方法中控制序列化的內容;readExternal方法在反序列化時被調用,可以在該方法中控制反序列化的內容。
package book.io;
import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.util.Date;
/**
* 控制序列化就是有選擇的序列化對象,而不是把所有對象的一切內容進行序列化。
* SerializeObject演示了使用transit關鍵字可以控制變量不被序列化。
* 本程序將演示通過實現Externalizable接口控制對象的序列化和反序列化。
*/
public class SerializeControl {
/**
* 內部類,用于測試控制對象的序列化和反序列化。
* 被序列化的對象必須實現Externalizable接口,該接口有2個方法:
* writeExternal方法、readExternal方法。
* 當序列化對象的時候,writeExternal方法會自動執行,所有的對象寫入操作由該方法控制。
* 反序列化對象的時候,readExternal方法會自動執行,如果想訪問writeExternal寫入的內容,
* 也只能在該方法里編寫恢復對象的代碼。
*/
static class MyClassControl implements Externalizable{
int serialClassInt;
int a=3, b=4;
public MyClassControl(){
System.out.println("MyClass constructor!");
this.serialClassInt = 9;
}
public void show(){
System.out.println("serialClassInt: " + serialClassInt);
}
//當序列化對象的時候,該方法自動被調用
public void writeExternal(ObjectOutput out) throws IOException{
System.out.println("run writeExternal");
//可以在序列化時寫非自身的變量,
Date d = new Date();
out.writeObject(d);
//只序列化serialClassInt變量,a、b兩個變量不被序列化
out.writeInt(this.serialClassInt);
}
// 當反序列化對象的時候, 該方法自動被調用
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
System.out.println("run readExternal");
Date d = (Date) in.readObject();
System.out.println(d);
this.serialClassInt = in.readInt();
}
}
/**
* 序列化對象
*/
public static void serializable(String fileName) throws Exception{
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));
MyClassControl my1 = new MyClassControl();
out.writeObject(my1);
out.close();
}
/**
* 反序列化
*/
public static void deserializable(String fileName)throws Exception{
ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
MyClassControl my2 = (MyClassControl)in.readObject();
my2.show();
in.close();
}
public static void main(String[] args) throws Exception{
String fileName = "c:/temp/MyClassControl.ser";
SerializeControl.serializable(fileName);
SerializeControl.deserializable(fileName);
}
}
--
學海無涯