「今日、オブジェクトのファイルへの保存とファイルからの読み取りについて調査したことを覚えていますか?」

「はい、入力ストリームからの読み取りを出力ストリームに保存したところです。」

「よくやった、アミーゴ。細かいところまで気づいていただいてうれしいです。ファイルに保存したり、ファイルから読み込んだりできるようにコードを完成させることはできますか?」

「何を完成させるのですか?! FileInputStream と FileOutputStream を宣言し、それらを save メソッドとload メソッドに渡します。ここでは混乱する必要はありません。非常に簡単です。」

「嬉しいです。次は新しい話題です。連載です。」

シリアル化は先ほど行ったこととほぼ同じですが、はるかに優れており、Java マシンに直接組み込まれています。Java マシンは、そのオブジェクトを保存およびロードできます。これを行うには、save メソッドやload メソッドも必要ありません。すべてのオブジェクトは Java マシン内に保存されており、Java マシンはそれらに完全にアクセスできます。」

オブジェクトを取得してストリームに保存し、ストリームから読み取るだけです。

コード
public static void main(String[] args) throws Exception
{
 Cat cat = new Cat();

 //Save a cat to file
 FileOutputStream fileOutput = new FileOutputStream("cat.dat");
 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
 outputStream.writeObject(cat);
 fileOutput.close();
 outputStream.close();

 //Load a cat from file
 FileInputStream fiStream = new FileInputStream("cat.dat");
 ObjectInputStream objectStream = new ObjectInputStream(fiStream);
 Object object = objectStream.readObject();
 fiStream.close();
 objectStream.close();

 Cat newCat = (Cat)object;
}

"それでおしまい?"

「その通りです。非常に大規模で複雑なシリアル化メカニズムがあり、これを使用してストリームに保存したり、ほぼすべてのデータ型のストリームから読み取ることができます。」

「ほぼすべてです。では、データ型はありませんか?」

「はい、実際には、すべてのオブジェクトが保存する固有の機能を備えているわけではありません。一部のオブジェクトは、すべてのデータを内部に保存しません。代わりに、単に他のオブジェクトやデータ ソースを参照するだけです。たとえば、コンソール (System. in)、入力ストリーム (InputStream)、その他のもの。」

Java の作成者が特別なSerializableインターフェイス マーカーを考案したのはこのためです。データやメソッドが含まれていないため、これはマーカーと呼ばれます。これはクラスを「タグ付け」または「マーク」するためにのみ使用されます。クラスがすべてのデータを内部に保存していると思われる場合は、それをimplements Serializableでマークできます。

シリアル化をサポートする«cat»の例を次に示します。

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

オブジェクトをシリアル化 (保存) しようとすると、Java マシンはシリアル化をサポートしているかどうかをチェックします。つまり、Serializable インターフェイスが実装されているかどうかを確認します。存在する場合は、オブジェクトが保存されます。そうでない場合は、シリアル化が不可能であることを示す例外をスローします。
ここで、シリアル化可能なオブジェクトはシリアル化可能なオブジェクトのみで構成されている必要があることを理解する必要があります。

「なるほど、それは当然です。部分を保存せずに全体を保存することはできません。」

"その通り。"

「それでは、int、String、ArrayList はどうなるのでしょうか?」

「それらはすべてシリアル化をサポートしています。Java の作成者は、これが確実に行われるように特別な注意を払いました。ここでは何の問題もないはずです。」

さらに、オブジェクトの型は、オブジェクトがシリアル化されるときに保存されます。これで、Cat オブジェクトへの参照を Object 変数に保存できるようになりました。すべてが問題なくシリアル化および逆シリアル化されます。

「デシリアライズ?」

「逆シリアル化とは、シリアル化を逆に行うプロセスです。つまり、ストリーム/ファイルからオブジェクトを読み取って再構築します。」

「ああ、それではもう質問はありません。」