Java's ArrayList uses custom serialization and explicitly writes the size. Nevertheless, size is not marked in ArrayList as transient. Why is size written two times: once via defaultWriteObject and again vis writeInt(size) as shown below (writeObject method)?
s.defaultWriteObject();
// Write out size as capacity for behavioral 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]);
}