Java Gold SE11対策:シリアライズの基本と試験で出るポイント総まとめ

アイキャッチ画像

Java Gold SE11 試験では、I/O の中でも「オブジェクトのシリアライズ(直列化)」に関する知識が問われます。特に、Serializable インタフェースや、ObjectInputStream / ObjectOutputStream の使い方、そして transient の挙動などが試験で頻出です。

また実務でも、オブジェクトをファイルに保存したり、ネットワーク越しに送信したりする際にはシリアライズが必要になります。本記事では、シリアライズの仕組みと代表的なクラス、試験での注意点をまとめて解説します。

シリアライズとは?

オブジェクトの状態(フィールド値)を「バイト列」に変換して、ファイルやネットワークなどに保存・送信する処理のこと。これを シリアライズ(直列化) と呼びます。

逆に、バイト列からオブジェクトに復元する処理は デシリアライズ(復元) と呼びます。

シリアライズの用途

シリアライズの主な用途は次の通りです:

  • ローカルに保存(ログ、キャッシュ、設定などの保存)
  • ネットワーク通信(RMI、ソケット通信など)
  • HTTPセッションの管理(Servletコンテナが自動的に保存)
  • データベースにバイナリとして格納(要注意)

プリミティブ型(int, booleanなど)にはシリアライズは不要
プリミティブ型はバイト列への変換が明確で軽量なため、シリアライズ不要で扱えます。

一方、オブジェクト(参照型) は複雑な構造を持つため、シリアライズして保存・送信する必要があります。参照型は、Serializable インタフェースを実装していないとシリアライズできません。

シリアライズに必要な要件

Serializableインタフェース

オブジェクトをシリアライズするには、java.io.Serializable インタフェースを実装しておく必要があります。

class User implements Serializable {

    private String name;

    private int age;

}

Serializable は マーカーインタフェース(メソッドなし)
これを実装しただけでシリアライズ可能になります。

ObjectOutputStream / ObjectInputStream

// シリアライズ(書き出し)

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“user.obj”))) {

    oos.writeObject(new User(“田中”, 20));

} catch (IOException e) {

    e.printStackTrace();

}

// デシリアライズ(読み込み)

try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“user.obj”))) {

    User user = (User) ois.readObject();

    System.out.println(user.getName());

} catch (IOException | ClassNotFoundException e) {

    e.printStackTrace();

}

writeObject() / readObject() は例外が多いため、try-with-resources + 複数例外キャッチが基本。

transient 修飾子

一部のフィールドはシリアライズ対象から除外したい場合、transient 修飾子を使います。

class Account implements Serializable {

    private String userName;

    private transient String password; // シリアライズされない

}

試験では「passwordなどの機密情報をシリアライズしないようにするには?」という観点で問われます。

serialVersionUID

同じクラスでも、バージョン違いでデシリアライズ時に InvalidClassException が発生するのを防ぐために、serialVersionUID を明示的に定義するのが推奨されています。

private static final long serialVersionUID = 1L;

試験で問われやすいポイントまとめ

問題パターン説明
Serializable の有無実装していないと例外が発生する
transient の挙動シリアライズされない
serialVersionUIDバージョン不一致対策。定義しないと危険
writeObject()/readObject()例外多発(IOException, ClassNotFoundException)
プリミティブ型との違いintやbooleanはシリアライズ不要(オブジェクトだけが対象)

おわりに

シリアライズは、Java におけるオブジェクトの保存・転送の基本手段のひとつです。特に Serializable を忘れたり、transient の効果を理解していなかったりすると、思わぬバグや例外につながります。

また、プリミティブ型はバイト変換が直接可能なのでシリアライズは不要ですが、すべての参照型(オブジェクト)は原則シリアライズが必要です。

Java Gold SE11 試験では、コードの中でどのフィールドが保存されるか、例外がどこで発生するかなど、細かい挙動が問われるので、見落とさないようにしましょう。