Jon*_*han 3 java serialization java-custom-serialization
JavaArrayList使用自定义序列化并显式编写size. 然而,尺寸并未在ArrayListas中标记transient。为什么size要写两次:一次via 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]);
}
Run Code Online (Sandbox Code Playgroud)
它的存在只是为了与旧的 java 版本兼容。
如果你看一下上面的评论s.writeInt(size),你会发现这应该是容量。在以前的java版本中,序列化形式具有ArrayList大小和容量。
它们都代表 的实际属性ArrayList。表示size其中的项目数,ArrayList而指capacity的是其中不需要重新创建数组的情况下可能的项目数(数组的长度)。
如果你看一下readObject,你会发现容量被忽略了:
// Read in capacity
s.readInt(); // ignored
Run Code Online (Sandbox Code Playgroud)
这是因为它已在以前的 java 版本中使用,并且仍然需要写入/读取以保持兼容性。
如果您查看匹配的 JDK6 源代码,您会发现这实际上是以前使用过的。如果您有序列化的 JDK6ArrayList并尝试使用较新的 JDK 反序列化它,它会起作用。但如果只是跳过容量,这将会失败,并且您无法使用ArrayList旧版本反序列化任何内容。
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |