シリアル化メカニズムのコードを実験して調べているときに、いくつかのことがわかりました。
1) オブジェクトが Externalizable であることが判明した場合は、Externalizable にキャストされ、対応するメソッドが呼び出されます。一方、Serializable オブジェクトの場合は、readObject/writeObject があるかどうか反射的にチェックされます。そのため、少し遅くなるかもしれませんが、
2) Externalizable の書き込みデータ量は、Serializable with readObject/writeObject よりも少し少ない (B のオブジェクトを書いたときに、次のコードで 1 バイトの違いが見つかりました)。
外部化可能の場合:
static class A implements Externalizable
{
@Override
public void writeExternal(ObjectOutput out) throws IOException
{
System.out.println("A write called");
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
{
System.out.println("A read called");
}
}
static class B extends A implements Externalizable
{
@Override
public void writeExternal(ObjectOutput out) throws IOException
{
super.writeExternal(out);
System.out.println("B write called");
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
{
super.readExternal(in);
System.out.println("B read called");
}
}
シリアライズ可能の場合:
static class A implements Serializable
{
private void writeObject(ObjectOutputStream out) throws IOException
{
System.out.println("A write called");
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
System.out.println("A read called");
}
}
static class B extends A implements Serializable
{
private void writeObject(ObjectOutputStream out) throws IOException
{
System.out.println("B write called");
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
System.out.println("B read called");
}
}