繁体   English   中英

为什么 ArrayList 大小字段不是瞬态的?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM