您的位置:首页 > 其它

关于序列化的一点补充

2015-08-06 19:46 316 查看
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值也不会被输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: