Externalizable API 解读
实现该接口的对象,在序列化的时候,会通过它的两个方法去进行序列化。writeExternal 和 readExternal 方法。要存储的每个对象都需要检测是否支持 Externalizable 接口。如果对象支持 Externalizable,则调用 writeExternal 方法。如果对象不支持 Externalizable 但实现了Serializable,则使用 ObjectOutputStream 保存该对象。也就是如果实现了Externalizable 接口,将代替定制的 writeObject 和 readObject 方法实现。
在重构 Externalizable 对象时,先使用无参数的公共构造方法创建一个实例,然后调用 readExternal 方法。通过从 ObjectInputStream 中读取 Serializable 对象可以恢复这些对象。(这段话,有个重点,就是通过实现Externalizable 接口来重构对象,将调用无参的构造函数,如果你的对象有其他的构造函数,默认是不会提供无参,找不到无参构造函数,在重构的时候就会报错)
什么情况下使用Externalizable
举个最简单的例子,你通过Serializable 接口来序列化对象,你必须要序列化整个对象的属性,假如这时,有些对象的属性不要序列化,你怎么搞,显然,这时需求就不能完成,这时就可以使用Externalizable ,它可以完全控制某对象的某个属性的序列化,其实到后面还有更简单的方法,用transient关键字。
public class Person1 implements Externalizable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person1() {
super();
// TODO Auto-generated constructor stub
}
public Person1(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
// TODO Auto-generated method stub
out.writeInt(age);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// TODO Auto-generated method stub
System.out.println(in.readInt());
}
}
我们只要求序列化Person1对象的age属性,实际上真正序列化的方法是writeExternal。