Javaのシリアライズとは?基礎からやさしく解説!

アイキャッチ画像

Javaのシリアライズとは?

Javaのシリアライズとは、オブジェクトの状態をバイトストリームとして保存・送信できるように変換する仕組みのことを指します。これにより、プログラム内で作成されたオブジェクトをファイルに保存したり、ネットワークを通じて他のシステムに送ったりすることが可能になります。

Javaのオブジェクトは通常、メモリ上に存在しているため、プログラムが終了するとその情報は失われてしまいます。しかし、シリアライズを使うことで、オブジェクトの中身をそのまま保存して、あとで復元することができるようになります。復元する処理はデシリアライズと呼ばれ、バイトストリームから元のオブジェクトを再構築します。

たとえば、ユーザーの設定情報やゲームのセーブデータなど、プログラムを終了したあとにも残しておきたい情報に対して、シリアライズは非常に便利です。Javaでは標準でこの機能がサポートされており、特別なライブラリを追加しなくても使えるのが魅力です。

このように、Javaのシリアライズは、オブジェクトの永続化や通信において重要な役割を果たしています。次のセクションでは、シリアライズが実際にどのような場面で使われるのかについて解説していきます。

シリアライズが使われる場面とは

Javaのシリアライズは、主にオブジェクトを一時的または永続的に保存したり、ネットワーク越しにデータをやり取りしたりする場面で使われます。たとえば、デスクトップアプリケーションでユーザーが入力した設定情報を次回起動時にも使いたい場合、シリアライズによってそのオブジェクトの状態をファイルに保存しておくことができます。そしてアプリケーションの再起動時にそのファイルを読み込み、デシリアライズすることで前回と同じ状態を再現できます。

また、分散処理システムやリモート通信を行うアプリケーションにおいてもシリアライズはよく使われます。例えば、サーバーとクライアント間でオブジェクトをそのまま送信したいとき、オブジェクトをシリアライズしてバイト列に変換し、それをネットワークを通じて送ることで、相手側でそのデータをデシリアライズして元のオブジェクトとして扱うことができます。

さらに、データベースにオブジェクトの状態をそのまま保存したい場合にもシリアライズは利用されます。ただし、この用途では後から内容を検索・更新する必要がある場合に不向きなこともあるため、適切に使い分けることが大切です。

このように、シリアライズは保存や通信といったさまざまな場面で活用されており、Javaでアプリケーションを開発するうえで知っておくと役立つ重要な技術です。次は、シリアライズを行うために必要なSerializableインターフェースについて詳しく説明していきます。

シリアライズの基本:Serializableインターフェースとは

Javaでオブジェクトをシリアライズするためには、対象のクラスがSerializableインターフェースを実装している必要があります。Serializableはマーカーインターフェースと呼ばれ、特別なメソッドを持たず、ただそのインターフェースを実装すること自体が「このクラスはシリアライズ可能です」と示す役割を持っています。

たとえば、あるクラスのインスタンスをファイルに保存したいとき、そのクラスがSerializableを実装していなければシリアライズすることはできません。実装方法はとても簡単で、クラス定義にimplements Serializableと記述するだけです。これだけでJavaのシリアライズ機能がそのクラスに対して有効になります。

ただし、クラスの中にシリアライズできないオブジェクトを含んでいる場合は注意が必要です。たとえば、ファイルハンドルやデータベース接続などはシリアライズの対象外であり、エラーの原因となることがあります。そのようなフィールドには後述するtransientキーワードを使うことで対処することができます。

Serializableを使うことによって、オブジェクトの保存やネットワーク通信が可能になり、Javaアプリケーションの柔軟性が高まります。次は、実際にどのようにシリアライズを実装するのか、具体的なコード例を交えてご紹介していきます。

Javaでのシリアライズの実装例

ここではJavaでのシリアライズの基本的な実装方法をご紹介します。まずはシンプルなUserクラスを作成し、それをファイルに保存する例を通して、シリアライズの流れを確認していきます。

以下のコードはUserクラスをシリアライズしてファイルに保存する例です。

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.io.Serializable;

public class User implements Serializable {

    private String name;

    private int age;

    public User(String name, int age) {

        this.name = name;

        this.age = age;

    }

}

public class SerializeExample {

    public static void main(String[] args) {

        User user = new User("田中太郎", 30);

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"))) {

            oos.writeObject(user);

            System.out.println("オブジェクトをファイルに保存しました。");

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

この例ではUserクラスがSerializableインターフェースを実装しており、そのインスタンスをObjectOutputStreamを使ってファイルに書き込んでいます。書き出し先のファイル名はuser.serとしており、これがバイトストリームとして保存されることになります。

注意点としては、Userクラスのすべてのフィールドがシリアライズ可能である必要があることです。もしシリアライズできないフィールドが含まれている場合は、transientキーワードなどで対応する必要があります。

このようにしてJavaではとても簡単にオブジェクトをファイルに保存することができます。