Transient: 此关键字智能用于变量,表示不能被序列化。
在ArrayList中存储元素的变量用transient修饰,所以理论上ArrayList不能被序列化。但是在ArrayList中却可以,因为在ArrayList中重写了writeObject 这个方法,所以可以转化为文件流,可以被序列化。
网上说这样设计的目的是因为在ArrayList中的存放元素的是一个素组,这个数组的容量大小基本上都会比实际的元素的个数要大,为了避免序列化没有元素的数组而重写。
实际上在我的测试中确实也是如此,阅读ObjectOutInputStream的源码会发现,如果你重写了writeObject 和readObjec 这个两个方法,在实际序列化的时候,会利用反射最终调用到你重写的writeObject和readObject 来序列化。