一、Externalizable简介
Externalizable接口继承了Serializable接口,用来在序列化时手动的把需要的对象信息进行序列化。Externalizable接口提供了两个方法:writeExternal(ObjectOuput out) 和 readExternal(ObjectInput in) 。在需要被序列化的类中实现这两个方法,这样在此类序列化时这两个方法将被自动执行,用以可定制地序列化此类。
一个例子
import java.io.*;
public class Country implements Externalizable {
private static final long serialVersionUID = 1L;
private String name;
private int code;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getCode() {
return this.code;
}
public void setCode(int code) {
this.code = code;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(name);
out.writeInt(code);
}
@Override
public void readExternal(ObjectInput in)
throws IOException, ClassNotFoundException {
this.name = in.readUTF();
this.code = in.readInt();
}
}
import java.io.*;
public class Text {
public static void main(String[] args) throws Exception {
Country c = new Country();
c.setCode(374);
c.setName("Armenia");
FileOutputStream fileOutputStream
= new FileOutputStream(new File("./Country.txt"));
ObjectOutputStream objectOutputStream
= new ObjectOutputStream(fileOutputStream);
c.writeExternal(objectOutputStream);
objectOutputStream.flush();
objectOutputStream.close();
fileOutputStream.close();
FileInputStream fileInputStream
= new FileInputStream(new File("./Country.txt"));
ObjectInputStream objectInputStream
= new ObjectInputStream(fileInputStream);
Country c2 = new Country();
c2.readExternal(objectInputStream);
objectInputStream.close();
fileInputStream.close();
System.out.println(c2.getCode()); //374
System.out.println(c2.getName()); //Armenia
System.out.println(c2.getCode() == c.getCode()); //true
System.out.println(c2.getName().equals(c.getName())); //true
}
}
二、Externalizable与Serializable的区别
- 关键区别是如何处理序列化过程。当类实现Serializable接口时,JVM完全负责类实例的序列化。在Externalizable的情况下,程序员应该负责整个序列化和反序列化过程。
- 如果需要序列化整个对象,那么Serializable接口更适合。对于自定义序列化,可以使用Externalizable来对过程进行控制。
- 通过使用transient关键字标记字段,可以使用Serializable接口实现自定义序列化。JVM不会序列化特定字段,但它会将字段添加到具有默认值的文件存储。
- 使用Externalizable时,必须按照写入时的确切顺序读取所有字段状态。否则会出现异常,而Serializable接口没有这个要求。
网友评论