【发布时间】:2010-04-26 21:50:03
【问题描述】:
有时(实际上相当多)我们会在 Java 中遇到两个对象指向同一事物的情况。现在,如果我们分别对它们进行序列化,那么序列化的表单具有对象的单独副本是非常合适的,因为应该可以打开一个而不打开另一个。但是,如果我们现在将它们都反序列化,我们会发现它们仍然是分开的。有什么方法可以将它们重新连接在一起吗?
示例如下。
public class Example {
private static class ContainerClass implements java.io.Serializable {
private ReferencedClass obj;
public ReferencedClass get() {
return obj;
}
public void set(ReferencedClass obj) {
this.obj = obj;
}
}
private static class ReferencedClass implements java.io.Serializable {
private int i = 0;
public int get() {
return i;
}
public void set(int i) {
this.i = i;
}
}
public static void main(String[] args) throws Exception {
//Initialise the classes
ContainerClass test1 = new ContainerClass();
ContainerClass test2 = new ContainerClass();
ReferencedClass ref = new ReferencedClass();
//Make both container class point to the same reference
test1.set(ref);
test2.set(ref);
//This does what we expect: setting the integer in one (way of accessing the) referenced class sets it in the other one
test1.get().set(1234);
System.out.println(Integer.toString(test2.get().get()));
//Now serialise the container classes
java.io.ObjectOutputStream os = new java.io.ObjectOutputStream(new java.io.FileOutputStream("C:\\Users\\Public\\test1.ser"));
os.writeObject(test1);
os.close();
os = new java.io.ObjectOutputStream(new java.io.FileOutputStream("C:\\Users\\Public\\test2.ser"));
os.writeObject(test2);
os.close();
//And deserialise them
java.io.ObjectInputStream is = new java.io.ObjectInputStream(new java.io.FileInputStream("C:\\Users\\Public\\test1.ser"));
ContainerClass test3 = (ContainerClass)is.readObject();
is.close();
is = new java.io.ObjectInputStream(new java.io.FileInputStream("C:\\Users\\Public\\test2.ser"));
ContainerClass test4 = (ContainerClass)is.readObject();
is.close();
//We expect the same thing as before, and would expect a result of 4321, but this doesn't happen as the referenced objects are now separate instances
test3.get().set(4321);
System.out.println(Integer.toString(test4.get().get()));
}
}
【问题讨论】:
-
+1 在任何语言中反序列化对象的祸根
标签: java serialization