我在阅读Java的ArrayList源码时遇到了它的支撑数组声明:
private transient Object[] elementData;
为什么这个需要是瞬态的?为什么这个类不能被序列化?
感谢帮助!
它可以被序列化; ArrayList
类会自己处理,而不是使用默认的机制。查看该类中的 writeObject()
和 readObject()
方法,它们是标准序列化机制的一部分。
如果你查看源码,你会发现writeObject()
方法不会保存支持数组。相反,它将元素(包括 null 值)一个接一个地序列化到size()
限制为止。这避免了序列化数组及特别是数组末尾的任何未使用插槽的开销。在反序列化时,readObject()
会创建一个新的支持数组,大小为所需最小值。
ArrayList
实现了Serializable
接口,因此它可以被序列化。这正是为什么私有的后备数组是transient
的原因,因为它不会随着类中的其他数据一起被序列化,所有这些都由ArrayList
的writeObject
和readObject
方法处理。
在Stephen C的回答基础上进行扩展,我想更正他关于在ArrayLists
中使用transient
来提高可读性的说明。这可能更适合作为他回答下面的评论,但我还没有那个能力!
虽然将字段标记为transient
有助于提高可读性,但由于自定义的readObject
和writeObject
方法调用了java.io.ObjectInputStream
的defaultReadObject
和java.io.ObjectOutputStream
的defaultWriteObject
方法,因此这也是必要的。这些方法将处理所有未标记为transient
的字段(例如size
)的序列化工作。
有关更多详细信息,请参见ObjectOutputStream
的源代码:https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/io/ObjectOutputStream.java#L431
该变量不可序列化。
该变量是多余的。
链接:http://onjava.com/pub/a/onjava/excerpt/JavaRMI_10/index.html?page=3
elementData
被标记为transient
。1)Object[]
元素将是可序列化的,否则ArrayList
的序列化将失败。2)ArrayList
的元素不是“冗余”的。请参见其他答案以获取正确的解释。 - Stephen C
readObject
和writeObject
方法? - Jianxin Gao