import java.io.*;
class A implements java.io.Serializable{
//静态值不序列化.
static long someValue = 1;
//序列化
int foo = 10;
//Transien 属性不序列化
transient String bar = "Hello World";
//如果baz指向A B实例,那么其对象也序列化
B baz;
}
class B extends A{
//不序列化
transient long lastRead;
//序列化
int serializationCount = 0;
//自行处理反序列方法,如果没有其方法,系统会自动取采默认的方法进行反序列化。(通常自行处理,是为了提高处理反序列的速度。)
private void readObject(ObjectInputStream in){
try{
//使用默人的反序列方法。
in.defaultReadObject();
}catch(IOException ex){
ex.printStackTrace();
}catch(ClassNotFoundException ex){
ex.printStackTrace();
}
//反序列化后统计。(大家思考一下吧~~~这里做个统计,我是有什么意思。)
serializationCount ++;
//设置其transient的值。
lastRead = System.currentTimeMillis();
}
}
public class SerializationTest{
public static void main(String[] args){
try{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
//创建对象并改变对象的一些值.
A obj = new A();
obj.foo = 11;
obj.bar = "GoodBye World...";
obj.baz = new B();
obj.baz.lastRead = -1;
//序列化对象
out.writeObject(obj);
//创建一个流用来反序列对象
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream in = new ObjectInputStream(bin);
//反序列的对象
obj = (A)in.readObject();
System.out.println(obj.foo); //print 11;
System.out.println(obj.bar); //print null;
System.out.println(obj.baz.serializationCount);//print 1;
}catch(IOException ex){
ex.printStackTrace();
}catch(ClassNotFoundException ex){
ex.printStackTrace();
}
}
}
现在作些解释吧~~ 以上序列化器和反序列化器是同一个对象,而惟一的中间媒体是一个字节数组。readObject在ObjectInputStream.readObject被调用时调用。它所做的第一件事是调用缺省的反序列化过程,该过程把SerializationCount恢复到实例刚被序列化时的数组。该值随后会递增。随后,可以随过查看该值看一下这个特定的对象被序列化的反序列的次数。注意:如果使用与输入相同的字节流进行反序列化运算,就会有两个相同的对象。
CAnca 的陋室
2007.3.18