Пометка элемента transient
не означает, что поле не сериализуется, а только то, что оно не сериализуется автоматически с использованием встроенного в Java механизма сериализации для полей.
В случаеиз ArrayList
сериализация выполняется с помощью пользовательского writeObject
метода: [src]
private void writeObject(java.io.ObjectOutputStream s)
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();
}
}
Десериализация выполняется с использованием readObject
.