• java文件传输基础:transient


    transient修饰就真的不会序列化?那怎么传输被transient修饰的关键内容?

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

    被transient修饰的elementData确实不会被序列化,那么elementData到底怎么传输呢?

    序列化方法

    /**
     * 将ArrayLisy实例的状态保存到一个流里面
     */
    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);
     
        // 按照顺序写入所有的元素
        for (int i=0; i<size; i++) {
            s.writeObject(elementData[i]);
        }
     
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }
    

    反序列化方法

    /**
     * 根据一个流(参数)重新生成一个ArrayList
     */
    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        elementData = EMPTY_ELEMENTDATA;
     
        // Read in size, and any hidden stuff
        s.defaultReadObject();
     
        // Read in capacity
        s.readInt();
     
        if (size > 0) {
            // be like clone(), allocate array based upon size not capacity
            ensureCapacityInternal(size);
     
            Object[] a = elementData;
            // Read in all elements in the proper order.
            for (int i=0; i<size; i++) {
                a[i] = s.readObject();
            }
        }
    }
    

    看完序列化,反序列化方法,我们终于又能回答开篇的第二个问题了。elementData之所以用transient修饰,是因为JDK不想将整个elementData都序列化或者反序列化,而只是将size实际存储的元素序列化或反序列化,从而节省空间和时间。

    序列化 文章1

    序列化 文章2

  • 相关阅读:
    单例模式
    js事件
    oracle_to_excel
    jquery_2
    jquery_1
    4.linux 复制,删除,重命名
    一个tomcat下部署多个springboot项目
    3.centos7 安装oracle
    桥接模式
    组合模式
  • 原文地址:https://www.cnblogs.com/sweetorangezzz/p/12926559.html
Copyright © 2020-2023  润新知