throws java.io.IOException{
// Write out element count, and any hidden stuff
int expectedModCount = modCount;
s.defaultWriteObject();
// Write out size as capacity for behavioural compatibility with clone()
s.writeInt(size);
// Write out all elements in the proper order.
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
这个方法是在序列化本ArrayList时调用的,首先获取modCount,赋值到一个expectedModcount里。
然后调用参数输出流的defaultWriteObject方法,这个方法是将非静态非transient的属性写到流中的方法。
然后将size变量写入流中,为的是和clone方法行为兼容(我也不理解这句注释是什么意思)
然后挨个写每一个元素
最后检查modCount和expectedModcount是否一致,否则抛出并发异常。
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
elementData = EMPTY_ELEMENTDATA;
// Read in size, and any hidden stuff
s.defaultReadObject();
// Read in capacity
s.readInt(); // ignored
if (size > 0) {
// be like clone(), allocate array based upon size not capacity
ensureCapacityInternal(size);
Object[] a = elementData;
// Read in all elements in the proper order.
for (int i=0; i<size; i++) {
a[i] = s.readObject();
}
}
}
这是序列化输入的方法,首先现将底层数组置空。
然后调用输入流的defaultReadObject方法,读取本类非静态非transient的属性。然后读取长度。如果长度大于0,就先扩容,再将底层数组每个元素读入