ObjectOutputStream 的 Javadoc写道:
writeObject 方法用于将对象写入流。任何对象,包括字符串和数组,都是用 writeObject 编写的。可以将多个对象或原语写入流。对象必须从相应的 ObjectInputstream 以与写入时相同的类型和相同的顺序读回。
和
对其他对象的引用(瞬态或静态字段除外)也会导致这些对象被写入。对单个对象的多个引用使用引用共享机制进行编码,以便对象的图形可以恢复到与原始对象相同的形状。
特别是,如果同一个对象被重复写入一个ObjectOutputStream
,它的数据只被写入一次。
您可以通过运行以下程序来验证这一点:
class A implements Serializable {
C c;
}
class B implements Serializable {
C c;
}
class C implements Serializable {
}
public class Test {
public static void main(String[] args) throws Exception {
C c = new C();
A a = new A();
a.c = c;
B b = new B();
b.c = c;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(a);
oos.writeObject(b);
oos.writeObject(c);
}
byte[] data = baos.toByteArray();
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data))) {
A newA = (A) ois.readObject();
B newB = (B) ois.readObject();
C newC = (C) ois.readObject();
System.out.println(newA.c == newC && newB.c == newC); // prints "true"
}
}
}