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()函数来控制成员对象。
没有评论:
发表评论