关于序列化的一点补充
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值也不会被输出。
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值也不会被输出。
相关文章推荐
- 从AWR报告分析Oracle性能
- Android 消息推送
- linux svn代码版本回退
- Postgis常用函数
- 20个顶尖的 Python 语言机器学习开源项目
- [转]Spring配置之OpenSessionInViewFilter
- nyoj746整数划分(四)【区间dp】
- 怎样才是理想的程序员
- servlet 插入数据库乱码解决方法
- ubuntu系统上splinter使用笔记
- 3687-Labeling Balls-反向拓扑排序
- OC数字和集对象【官方文档】
- 模板方法模式
- curl转让query string逃生参数
- IOC原理解释
- Binary Search Tree
- Android学习路线——渐进
- lua_code_cache开关
- 我好换一个博客了
- 关于Character的digit,forDigit,getNumericValue方法的一点理解