Java readObject / writeObject可以保存/加载超类,那么为什么需要read / writeExternal?

时间:2018-11-24 10:27:59

标签: java serialization externalizable

核心Java volumeII第二章说,与readObject / writeObject不同,readExternal / writeExternal能够保存和恢复包括超类在内的数据。我只是做了一个实验,似乎readObject / writeObject可以完成相同的工作:

class base implements Serializable{
    protected String field = "xyz";
}
class c1 extends base implements Serializable {
    private String name = "name";
    private int age = 12;

    private void readObject(ObjectInputStream ois) {
        System.out.println("readObject!!");
        try {
            field = (String) ois.readObject();
            name = (String) ois.readObject();
            age = ois.readInt();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void writeObject(ObjectOutputStream oos) {
        System.out.println("writeObject!!");
        try {
            oos.writeObject(field);
            oos.writeObject(name);
            oos.writeInt(age);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我的问题是:我们什么时候需要使用readExternal / writeExternal()?我看不到readExternal / writeExternal可以做的任何工作,而readObject / writeObject不能做。

请帮助澄清。非常感谢。

1 个答案:

答案 0 :(得分:3)

Serializable和Extenalizable都用于序列化或持久化Java对象,但是它们的方式有所不同。 如果是可序列化的,则Java虚拟机可以完全控制对象的序列化,而如果是可外部化的,则应用程序可以控制对象的持久化。 writeExternal()和readExternal()方法为应用程序提供了对序列化过程的格式和内容的完全控制,可用于提高序列化过程的性能和速度。