为什么ArrayList使用瞬态存储?

Jac*_*k K 30 java arraylist transient

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

private transient Object[] elementData;
Run Code Online (Sandbox Code Playgroud)

为什么这需要是暂时的?为什么不能将这个类序列化?

谢谢您的帮助!

Ern*_*ill 32

可以序列化; 该ArrayList班只是需要照顾的事情本身,而不是使用默认的机制.查看该类中的writeObject()readObject()方法,它们是标准序列化机制的一部分.

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


Ste*_*n C 6

为什么这需要是暂时的?

这样做是因为它提供的自定义readObjectwriteObject方法比默认更好地进行序列化.具体来说,writeObject方法只写入元素的大小和顺序.这避免了序列化私有数组对象,其中1)具有其自己的头和开销,并且2)通常用nulls 填充.节省空间可能很重要.

(其实,我不认为现场严格需要被宣布为ArrayList所有,但它确实有助于记录开发者的意图.)

为什么不能将这个类序列化?

整个Object[]班级可以序列化1.该transient可序列化,但他们选择了实现它的另一种方式.


1 - 实际上,这取决于元素的运行时类型.例如,如果您尝试序列化ArrayList包含Thread引用,那么您将获得第一个非null引用的运行时异常.


Die*_*ego 5

ArrayList实现Serializable,因此它可以被序列化,这正是私有后备数组是 的原因transient,因此它不会与类中的其他数据一起序列化,因为所有数据都由ArrayList'swriteObjectreadObject方法处理。