序列化是否保留对象标识?
我正在使用Java接口和序列化对象(到目前为止,此方法对于我的目的来说已经足够了)。Serializable
ObjectOutputStream
我的API依赖于某些操作的对象标识,我想知道它是否将通过序列化来保留。也就是说:如果对于两个任意对象 a
和 b
,它在序列化之前保持 a == b
,那么在反序列化之后它是否仍然成立?
我发现一些文本声称相反 - 但他们要么写了一个旧版本的JRE(我只对1.6感兴趣,也许对1.5感兴趣),要么关心RMI(这与我无关)。
关于对象标识的文档不是很简短。一篇关于 sun.com 的技术文章提到了对对象使用缓存,对我来说,这只有在确实保留了对象标识时才有意义,但我没有足够的信心来依赖这些脆弱的证据。ObjectOutputStream
我已经尝试过(Java 1.6,OS X),发现是的,通过序列化,对象的标识保持不变。但是,我可以从这些结果中推断出来,还是不可靠?
对于我的测试,我序列化了以下对象图:
C----------+
| b1 b2 |
+----------+
| |
v v
B---+ B---+
| a | | a |
+---+ +---+
\ /
\ /
\/
A----+
| |
+----+
最小的再现代码:
import java.io.*;
public class SerializeTest {
static class A implements Serializable {}
static class B implements Serializable {
final A a;
public B(A a) {
this.a = a;
}
}
static class C implements Serializable {
final B b1, b2;
public C() {
A object = new A();
b1 = b2 = new B(object);
}
}
public static void main(String[] args) throws IOException,
ClassNotFoundException {
C before = new C();
System.out.print("Before: ");
System.out.println(before.b1.a == before.b2.a);
// Serialization.
ByteArrayOutputStream data = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(data);
out.writeObject(before);
out.close();
// Deserialization.
ObjectInputStream in =
new ObjectInputStream(new ByteArrayInputStream(data.toByteArray()));
C after = (C) in.readObject();
System.out.print("After: ");
System.out.println(after.b1.a == after.b2.a);
}
}