Posted on 2009-05-24 22:44
啥都写点 阅读(219)
评论(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);
}
}
-- 学海无涯