问题遇到的现象
在学习Java对象序列化的时候,看到了这么一个知识点:
在使用ObjectOutputStream的writeObject()方法多次对一个对象序列化的时候,只会在第一次序列化的时候写入序列化信息,在以后对该对象进行序列化的时候,如果发现该对象已经被序列化了之后,只会输出一个序列化的编号,用来保证序列化的对象是同一个对象.但是下面代码:
public class Demo2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
try (
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"))
) {
Person ps = new Person("孙悟空", 500);
// 序列化ps
oos.writeObject(ps);
// 修改ps的属性
ps.name = "猪八戒";
// 再次序列化
oos.writeObject(ps);
// 反序列化
Person person1 = (Person) ois.readObject();
Person person2 = (Person) ois.readObject();
System.out.println(person1 == person2);
System.out.println(person1.name + "=======" + person2.name);
}
}
}
class Person implements Serializable {
String name;
Integer age;
public Person(String name, Integer age) {
this.age = age;
this.name = name;
}
}
运行结果
true
孙悟空=======孙悟空
结果显示这两个反序列化的对象是同一个对象,并且name的属性值是第一次序列化的时候的属性值,我对对象的修改并没有生效,这也证实了第二次序列化的时候只是输出了一个编号,这是序列化的好处和弊端,但是这样的话我序列化一个对象之后就不能再对其做出更改了,如何避免上述代码出现的问题呢?