首页 > 其他 > 详细

ArrayList的序列化与反序列化

时间:2015-04-29 21:52:52      阅读:333      评论:0      收藏:0      [点我收藏+]

       最近在阅读ArrayList的源代码时,发现了ArrayList中的用来保存数据的数据使用了transient关键字声明。如下:

private transient Object[] elementData;

当时产生了一个疑问,难道ArrayList不可以序列化吗?但是它又实现了Serializable接口,感觉有点自相矛盾了。

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable


后来仔细往下阅读了代码,才发现了原因。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 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();
        }
    }


首先通过s.defaultWriteObject();对非transient变量进行了序列化。然后又通过

 for (int i=0; i<size; i++) {
            s.writeObject(elementData[i]);
        }

这个循环对数组中的有值的元素逐个进行了序列化操作。


反序列化时也是一样,首先通过s.defaultReadObject();;对非transient变量进行了反序列化。然后又通过

   for (int i=0; i<size; i++) {
                a[i] = s.readObject();
            }

这个循环对数组中的有值的元素逐个进行反序列化操作。


      之所以这样的一个原因是ArrayList的值数组elementData的大小并不一定等于数组的size的大小。size是ArrayList中add进的个数。由于ArrayList有动态扩容的机制,所以elementData的大小总是大于size.所以通过对elementData中有效的元素进行逐个的序列化可以明显的提高效率。

ArrayList的序列化与反序列化

原文:http://blog.csdn.net/qfycc92/article/details/45370011

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!