【发布时间】:2013-02-05 15:54:57
【问题描述】:
我有一个关于 Java 序列化语义的问题:反序列化同一个对象两次实际上会在内存中创建两个实例吗?例如:
ByteArrayOutputStream ba = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(ba);
LinkedListNode tail = new LinkedListNode(null);
LinkedListNode n1 = new LinkedListNode(tail);
oos.writeObject(n1);
oos.flush();
ByteArrayInputStream bi = new ByteArrayInputStream(ba.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bi);
LinkedListNode r1 = (Node)ois.readObject();
ByteArrayInputStream bi2 = new ByteArrayInputStream(ba.toByteArray());
ObjectInputStream ois2 = new ObjectInputStream(bi2);
LinkedListNode r2 = (Node)ois2.readObject();
System.out.println("r1 == r2 " + (r1 == r2)); // prints false
System.out.println("r1.next == r2.next " + (r1.next == r2.next)); // prints false
代码似乎暗示答案是肯定的。我想知道这种行为是否有意义?
【问题讨论】:
-
是的,是的。反序列化意味着您将基于序列化数据创建一个对象,因此它必须是一个新实例。此外,如果您反序列化数据并生成具有相同地址位置的相同对象(从而产生内存泄漏),那将是非常糟糕。
标签: java serialization deserialization