关于序列化的一点补充

来源:互联网 发布:淘宝免单吧 编辑:程序博客网 时间:2024/05/19 07:07


public class WriteTeacher {
public static void main(String[] args) throws IOException{
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("teacher.txt"));
Person1 per = new Person1("孙悟空", 500);
Teacher t1 = new Teacher("唐僧", per);
Teacher t2 = new Teacher("菩提祖师", per);
//依次将4个对象写入输出流中
oos.writeObject(t1);
oos.writeObject(t2);
oos.writeObject(per);
oos.writeObject(t2);
}
}


//上面代码4次调用了writeObject()方法输出对象,实际上只序列化了3个对象,而且序列化的两个Teacher
//对象的引用实际上是同一个Person对象。
//所以java序列化机制采用了一种特殊的序列化算法:
//1.所有保存到磁盘中的对象都有一个序列化编号
//2.当程序试图序列化一个对象时,程序将先检查该对象是否已经被序列化过,只有该对象从从未(在本次虚拟机中)被
//序列化过,系统才会将该对象转换成字节序列并输出

//3.如果某个对象已经被序列化过,程序将直接输出一个序列化编号,而不是再次重新序列化该对象。



public class SerializeMutable {
public static void main(String[] args) throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("mutable.txt"));
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("mutable.txt"));
Person1 per = new Person1("孙悟空",500);
//Person1 per1 = new Person1("猪八戒",400);
oos.writeObject(per);
//改变per对象的name Field的值
per.setName("猪八戒");
//oos.writeObject(per1);
//系统只是输出序列化编号,所以改变后的name不会被序列化
oos.writeObject(per);
Person1 p1 = (Person1)ois.readObject(); //1
Person1 p2 = (Person1)ois.readObject(); //2
//下面输出true,即反序列化后p1等于p2
System.out.println(p1 == p2);
//下面依然看到输出“孙悟空”,即改变后的Field没有被序列化
System.out.println(p2.getName());
}
}
//需要注意的是:由于java序列化机制使然,如果多次序列化同一个java对象时,只有第一次使用writeObject()方法
//输出时才会将该对象转换成字节序列并输出,当再次调用writeObject()方法时,程序只是输出前面的序列化编号,即使后面的
//对象的Field值已被改变,改变的Field值也不会被输出。







0 0
原创粉丝点击