为什么 ArrayList 使用瞬态存储?

2022-09-01 04:31:34

我正在阅读Java的ArrayList的源代码,我遇到了它的支持数组声明:

private transient Object[] elementData;

为什么这需要是瞬态的?为什么不能序列化此类?

感谢您的帮助!


答案 1

它可以序列化;该类只是自己处理事情,而不是使用默认机制。查看该类中的 和 方法,它们是标准序列化机制的一部分。ArrayListwriteObject()readObject()

如果您查看源,您会看到它没有保存后备数组。相反,它会一次序列化一个元素(包括空值),直到达到限制。这避免了序列化数组的开销,尤其是数组末尾的任何未使用的插槽。反序列化时,由 创建所需最小大小的新支持数组。writeObject()size()readObject()


答案 2

为什么这需要是瞬态的?

它之所以这样做,是因为它提供了比默认序列化更好的自定义和方法。具体来说,writeObject 方法只写入元素的大小和顺序。这避免了序列化私有数组对象,1) 具有自己的标头和开销,2) 通常使用 s 进行填充。节省空间可以显著。readObjectwriteObjectnull

为什么不能序列化此类?

整个类可以序列化1.可以直接序列化,但他们选择将其标记为以另一种方式实现序列化。ArrayListObject[]transient


1 - 实际上,这取决于元素的运行时类型。例如,如果尝试序列化包含线程引用的 ArrayList,则第一个非空引用将出现运行时异常。


推荐