「こんにちは、アミーゴ! エリーが言ったことに少し付け加えたいと思います。」

場合によっては、シリアル化プロセスを制御する必要があります。その理由は次のとおりです。

1) オブジェクトはシリアル化の準備ができていません。オブジェクトの現在の内部状態は変更中です。

2) オブジェクトにはシリアル化できないオブジェクトが含まれていますが、それらを簡単にシリアル化できる形式に変換できます。たとえば、オブジェクトをバイト配列などとして保存します。

3) オブジェクトは、すべてのデータを 1 つの単位として逆シリアル化するか、シリアル化する前に暗号化するか、あるいはその両方を希望します。

シリアル化を手動で実行する理由は数多くあります。しかし、標準のシリアル化が提供するすべての利点を失いたくはありません。結局のところ、私たちのオブジェクトは他のオブジェクトを使用する可能性があります。ただし、オブジェクトがシリアル化をサポートしていない場合はシリアル化できません。

この状況にも解決策があります。それは、「外部化可能なインターフェイス」です。Java の先見の明のある作成者たちに感謝しなければなりません。SerializableインターフェイスをExternalizableインターフェイスに置き換えるだけで、クラスでシリアル化プロセスを手動で管理できるようになります。

Initializableインターフェイスには、 Serializableインターフェイスにはない2 つのメソッドがあります。これらは、オブジェクトがシリアル化されるときに Java マシンによって呼び出されます。見た目はこんな感じです。

コード
class Cat implements Externalizable
{
 public String name;
 public int age;
 public int weight;

 public void writeExternal(ObjectOutput out)
 {
  out.writeObject(name);
  out.writeInt(age);
  out.writeInt(weight);
}

 public void readExternal(ObjectInput in)
 {
  name = (String) in.readObject();
  age = in.readInt();
  weight = in.readInt();
 }
}

何か思い出しますか?

「なんと! これはまさに、シリアル化を検討する前にオブジェクトを保存しようとした方法です。」

「これにより、すべてがシンプルになります。標準のシリアル化が適切な場合は、 Serializableインターフェイスを継承するだけです。それが適切でない場合は、Initializable を継承し、オブジェクトを保存/ロードするための独自のコードを作成します。」

「しかし、外部化可能とマークされたクラスは直列化可能とみなされますか? そのようなクラスを使用して、直列化可能クラスへの参照を「安全に」保存できますか?

「はい。クラスがSerializableまたはExternalizableを実装している場合、そのクラスはシリアル化可能であるとみなされます。」

「完璧な解決策です。気に入っています。」

「それを聞いてうれしいです。でも、それ以上のことがあるんです…あらゆるニュアンスについてはハンス教授に聞いてください。それらは確かに存在します。彼はあなたに何か読むべきものを与えたかったのです。」