ArrayList的序列化与反序列化
来源:互联网 发布:软件系统维护方案 编辑:程序博客网 时间:2024/06/05 20:03
最近在阅读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的序列化与反序列化
- ArrayList的二进制序列化及反序列化实现
- ArrayList的二进制序列化及反序列化实现
- 序列化与反序列
- 序列化与反序列
- 用XmlSerializer串行化(序列化)ArrayList数组对象与反序列化
- 用XmlSerializer串行化(序列化)ArrayList数组对象与反序列化
- java序列化反序列化ArrayList集合
- POJO与JSON的序列化与反序列化
- Unity与C#的序列化与反序列化
- PHP的序列化与反序列化的使用
- XML序列化与反序列化
- 对象序列化与反序列化
- 序列化与反序列化
- 转载:序列化与反序列化
- c#序列化与反序列化
- java序列化与反序列化
- XML序列化与反序列化
- MTK功能机传感器介绍
- 【php】7、学生管理系统-管理员查看用户
- 怎么丰胸啊weixin 616628874
- soj 2818 dp
- Qss样式集合(持续更新)
- ArrayList的序列化与反序列化
- mysql学习笔记之九(多表数据记录查询)
- 【php】8、学生管理系统-查看管理员
- Delphi中Undac控件连接MYSQL数据库问题总结
- C# 产生验证码图片
- 设置对话框出现次序,不用按钮下设置,运行对话框1 ,对话框类2 。
- 机器学习算法原理与实践(三)、卡尔曼滤波器算法浅析及matlab实战
- 陈怡暖:2015.4.29晚间最强现货黄金白银操作建议
- Mondrian测试数据库footmart生成记