2011年6月13日星期一

  Java代码示例:自定义可序列化的ArrayList

 
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
 
public class SerializableList<E> extends ArrayList<E> implements Externalizable {
 
	public SerializableList() {
		super();
	}
 
	public SerializableList(Collection<? extends E> c) {
		super(c);
	}
 
	@SuppressWarnings("unchecked")
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
		int elementCount = in.readInt();
		this.ensureCapacity(elementCount);
		for (int i = 0; i < elementCount; i++) {
			this.add((E) in.readObject());
		}
 
	}
 
	public void writeExternal(ObjectOutput out) throws IOException {
		out.writeInt(size());
		for (int i = 0; i < size(); i++) {
			if (get(i) instanceof Serializable) {
				out.writeObject(get(i));
			} else {
				out.writeObject(null);
			}
		}
	}
 
}

代码分析:ArrayList默认如果某个元素没有实现Serializable接口,则会直接抛出异常。此类在性能上有小小的提高。

Externalizable接口和Serializable接口的区别:
1)    通过实现Serializable接口的方法,在保存对象时会把对象中所包含的成员对象也保存下来;而通过实现Externalizable接口的方法,在保存对象时不会保存任何成员对象。
2)    通过实现Serializable接口的方法,在恢复对象时不会调用任何构造函数(包括default构造函数);而通过实现Externalizable接口的方法,在恢复对象时会调用default构造函数。然后再调用readExternal()函数。
3)    利用writeExternal()和readExternal()函数来控制成员对象。

没有评论:

发表评论