LinkedList中的成员变量为什么要用transient修饰

2021-03-01  本文已影响0人  从零开始的程序猿生活

序列化有2种方式:
1、只是实现了Serializable接口
序列化时,调用java.io.ObjectOutputStream的defaultWriteObject方法,将对象序列化。(此时transient修饰的字段,不会被序列化)
2、实现了Serializable接口,同时提供了writeObject方法
序列化时,会调用该类的writeObject方法。而不是java.io.ObjectOutputStream的defaultWriteObject方法。(此时transient修饰的字段,是否会被序列化,取决于writeObject)

image.png

在LinkedList中 为成员变量都添加了transient修饰,但是真的就不被序列化了吗?看下图


image.png

在序列化之后,经过反序列化list中的值还是存在的。

原因:

这是因为LinkedList内部重写了writeObject()方法,所以序列化的时候走的自己的方法而不是ObjectOutputStream的writeObject()方法。

    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        // Write out any hidden serialization magic
        s.defaultWriteObject();

        // Write out size
        s.writeInt(size);

        // Write out all elements in the proper order.
        for (Node<E> x = first; x != null; x = x.next)
            s.writeObject(x.item);
    }
上一篇 下一篇

猜你喜欢

热点阅读