Answers:
Java跟踪已写入流中的对象,随后的实例作为ID写入,而不是实际的序列化对象。
因此,以您的示例为例,如果您将实例“ a”写入流中,则该流为该对象赋予唯一的ID(比方说“ 1”)。作为“ a”序列化的一部分,您必须序列化“ b”,并且流为它提供另一个id(“ 2”)。如果然后在流中写入“ b”,则唯一写入的是ID,而不是实际对象。
输入流相反地执行相同的操作:对于从流中读取的每个对象,它使用与输出流相同的算法分配一个ID号,并且该ID号引用映射中的对象实例。当看到使用ID序列化的对象时,它将从映射中检索原始实例。
这是怎样的API文档描述它:
使用引用共享机制对单个对象的多个引用进行编码,以便可以将对象的图恢复为与编写原始图时相同的形状
此行为可能会引起问题:由于流对每个对象都具有硬引用(这样它就知道何时替换ID),因此,如果向流中写入大量临时对象,则可能会耗尽内存。您可以通过致电解决此问题reset()
。
在Java中,这是通过缓存序列化的对象并在再次写入时写入其句柄来解决的。
请参阅http://docs.oracle.com/javase/6/docs/platform/serialization/spec/output.html中的步骤5 。