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()
.
为什么这需要是暂时的?
这样做是因为它提供的自定义readObject
和writeObject
方法比默认更好地进行序列化.具体来说,writeObject方法只写入元素的大小和顺序.这避免了序列化私有数组对象,其中1)具有其自己的头和开销,并且2)通常用null
s 填充.节省空间可能很重要.
(其实,我不认为现场严格需要被宣布为ArrayList
所有,但它确实有助于记录开发者的意图.)
为什么不能将这个类序列化?
整个Object[]
班级可以序列化1.该transient
可序列化,但他们选择了实现它的另一种方式.
1 - 实际上,这取决于元素的运行时类型.例如,如果您尝试序列化ArrayList
包含Thread
引用,那么您将获得第一个非null引用的运行时异常.
ArrayList
实现Serializable
,因此它可以被序列化,这正是私有后备数组是 的原因transient
,因此它不会与类中的其他数据一起序列化,因为所有数据都由ArrayList
'swriteObject
和readObject
方法处理。
归档时间: |
|
查看次数: |
5516 次 |
最近记录: |