[英]Why is the ArrayList size field not transient?
Java 的ArrayList
使用自定义序列化并显式写入size
。 然而,大小没有在ArrayList
中标记为transient
。 为什么 size 写了两次:一次是通过defaultWriteObject
,另一次是 vis writeInt(size)
,如下所示( writeObject
方法)?
s.defaultWriteObject();
// Write out size as capacity for behavioral compatibility with clone()
s.writeInt(size);
// Write out all elements in the proper order.
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
}
它的存在仅仅是为了与旧的 java 版本兼容。
如果您查看s.writeInt(size)
上面的注释,您会发现这应该是容量。 在之前的 java 版本中, ArrayList
的序列化形式具有大小和容量。
它们都代表ArrayList
的实际属性。 size
表示ArrayList
中的项数,而capacity
是指在不需要重新创建数组的情况下其中可能的项数(数组的长度)。
如果您查看readObject
,您会发现容量被忽略了:
// Read in capacity
s.readInt(); // ignored
这是因为它在以前的 java 版本中使用,仍然需要写入/读取以保持兼容性。
如果您查看匹配的 JDK6 源代码,您会发现这实际上是以前使用过的。 如果你有一个序列化的 JDK6 ArrayList
并尝试用更新的 JDK 反序列化它,它会起作用。 但是,如果刚刚跳过容量,这将失败,并且您无法使用旧版本中的ArrayList
反序列化任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.