Java arraylist如何在序列化后保留数据

Java arraylist如何在序列化后保留数据,java,serialization,deserialization,Java,Serialization,Deserialization,检查java.util.ArrayList实现时,请注意ArrayList中的元素数据对象数组是瞬态的,即使ArrayList是可序列化的 transient Object[] elementData; // non-private to simplify nested class access 那么,arrayList如何通过保持elementData arraytransient在反序列化过程中保存其数据呢?标记成员transient并不意味着字段没有被序列化,只是它没有使用Java内置的

检查java.util.ArrayList实现时,请注意ArrayList中的元素数据对象数组是瞬态的,即使ArrayList是可序列化的

transient Object[] elementData; // non-private to simplify nested class access

那么,arrayList如何通过保持elementData arraytransient反序列化过程中保存其数据呢?

标记成员
transient
并不意味着字段没有被序列化,只是它没有使用Java内置的字段序列化机制自动序列化

ArrayList
的情况下,通过自定义
writeObject
方法执行序列化:

private void writeObject(java.io.ObjectOutputStream)
抛出java.io.IOException{
//写出元素计数和任何隐藏的东西
int expectedModCount=modCount;
s、 defaultWriteObject();
//将大小写为与clone()行为兼容的容量
s、 写入(大小);
//按正确的顺序写出所有元素。
对于(int i=0;i谁会因为writeObject()是私有方法而启动它?
private
不是严格私有的:反射API允许访问
private
方法,内部序列化机制使用反射来查找和调用
writeObject
方法,即使它是私有的。
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();
    }
}