在对象序列化后,引用是保留还是创建一个新对象?
Upon the serialization of an object does the reference stay or create a new object?
这听起来像是一个显而易见的问题,但我想知道序列化是否会导致引用另一个对象的对象只是成为副本而不是引用。
如果我不清楚,请考虑以下代码:
public class Test implements Serializable {
String thing1 = new String("test");
String thing2 = thing1;
public static void main(String[] args) {
//Blah blah implementation
}
public static void serialize() {
try {
FileOutputStream fileoutput = new FileOutputStream(new File("test.ser"));
ObjectOutputStream objectoutput = new ObjectOutputStream(fileoutput);
objectoutput.writeObject(thing2);
objectoutput.close();
fileoutput.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException i) {
i.printStackTrace();
}
}
}
反序列化时,它会 return 作为对 thing1 的引用还是只是一个副本,但不引用它。
序列化的 thing2 确实不可能保留对 thing1 的引用。这是因为序列化过程将 thing2 变成了一个字节流,表示 thing2 是 class 的对象的状态和内容。如果对象包含其他对象,它们也必须是可序列化的,序列化才不会失败。他们的状态依次被序列化。
但是没有保留对象在序列化时的具体内存地址和内容。毕竟一个序列化对象可以写入一个文件,该文件在序列化它的程序停止执行后仍然存在。
反序列化又将字节流转回具有该序列化状态的 class 实例的副本。
所以不,它只是反序列化的一个副本,不会保留对从中复制的相同类型的另一个对象的引用。
我不知道答案,但应该很容易测试。反序列化并测试 ==,如果结果为真,则它是完全相同的实例。
如果字符串不是同一个实例,则 == 将为假,而 equals 将为真。
这听起来像是一个显而易见的问题,但我想知道序列化是否会导致引用另一个对象的对象只是成为副本而不是引用。
如果我不清楚,请考虑以下代码:
public class Test implements Serializable {
String thing1 = new String("test");
String thing2 = thing1;
public static void main(String[] args) {
//Blah blah implementation
}
public static void serialize() {
try {
FileOutputStream fileoutput = new FileOutputStream(new File("test.ser"));
ObjectOutputStream objectoutput = new ObjectOutputStream(fileoutput);
objectoutput.writeObject(thing2);
objectoutput.close();
fileoutput.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException i) {
i.printStackTrace();
}
}
}
反序列化时,它会 return 作为对 thing1 的引用还是只是一个副本,但不引用它。
序列化的 thing2 确实不可能保留对 thing1 的引用。这是因为序列化过程将 thing2 变成了一个字节流,表示 thing2 是 class 的对象的状态和内容。如果对象包含其他对象,它们也必须是可序列化的,序列化才不会失败。他们的状态依次被序列化。
但是没有保留对象在序列化时的具体内存地址和内容。毕竟一个序列化对象可以写入一个文件,该文件在序列化它的程序停止执行后仍然存在。
反序列化又将字节流转回具有该序列化状态的 class 实例的副本。
所以不,它只是反序列化的一个副本,不会保留对从中复制的相同类型的另一个对象的引用。
我不知道答案,但应该很容易测试。反序列化并测试 ==,如果结果为真,则它是完全相同的实例。
如果字符串不是同一个实例,则 == 将为假,而 equals 将为真。