序列化有2种方式:
A、只是实现了Serializable接口。
序列化时,调用java.io.ObjectOutputStream的defaultWriteObject方法,将对象序列化。
注意:此时transient修饰的字段,不会被序列化。
B、实现了Serializable接口,同时提供了writeObject方法。
序列化时,会调用该类的writeObject方法。而不是java.io.ObjectOutputStream的defaultWriteObject方法。
ArrayList实现了java.io.Serializable,复写了以下2个方法:
private void writeObject(java.io.ObjectOutputStream s)
private void readObject(java.io.ObjectInputStream s)
从源码中可以看出,先调用java.io.ObjectOutputStream的defaultWriteObject方法,进行默认的序列化操作,此时transient修饰的字段,没有被序列化。
接着:for循环,将数组中的元素写出,序列化。而数组中的元素正是transient。
PS:反序列化,也是这样。
A、只是实现了Serializable接口。
序列化时,调用java.io.ObjectOutputStream的defaultWriteObject方法,将对象序列化。
注意:此时transient修饰的字段,不会被序列化。
B、实现了Serializable接口,同时提供了writeObject方法。
序列化时,会调用该类的writeObject方法。而不是java.io.ObjectOutputStream的defaultWriteObject方法。
注意:此时transient修饰的字段,是否会被序列化,取决于writeObject。
ArrayList的源码:
- 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 array length
- s.writeInt(elementData.length);
- // 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实现了java.io.Serializable,复写了以下2个方法:
private void writeObject(java.io.ObjectOutputStream s)
private void readObject(java.io.ObjectInputStream s)
从源码中可以看出,先调用java.io.ObjectOutputStream的defaultWriteObject方法,进行默认的序列化操作,此时transient修饰的字段,没有被序列化。
接着:for循环,将数组中的元素写出,序列化。而数组中的元素正是transient。
PS:反序列化,也是这样。