Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaにおけるシリアライズ(Serializable)と外部化(Externalizable)の違いを徹底解説

Javaのシリアライズ(直列化)外部化(Externalizable)は、どちらもオブジェクトをバイトストリームに変換し、そのバイトストリームをデータベースやメモリに保存するための仕組みです。java.io.Serializableインターフェースを実装したクラスは自動的にシリアライズ可能となります。一方、外部化はアプリケーションの要件に応じてカスタマイズされたシリアライズを行いたい場合に使用され、Externalizableインターフェースはjava.io.Serializableを継承しています。

以下の表に、両者の主な違いをまとめました。

No.比較項目シリアライズ(Serializable)外部化(Externalizable)
1インターフェースメソッドを持たないマーカーインターフェースです。readExternal()writeExternal()の2つのメソッドが定義されています。
2実装ロジックこのインターフェースを実装したクラスは、オブジェクトのシリアライズや永続化の責務をJVMに委ねます。JVMは内部的にreadObject()writeObject()を使用して処理を行います。readExternal()writeExternal()をオーバーライドすることで、実装ロジックの制御権をアプリケーション側が持ちます。
3変数の除外方法シリアライズおよびデシリアライズの際、JVMはtransient修飾子が付いた変数を自動的に無視します。プログラマーが独自のロジックを記述し、任意の変数を除外することができます。
4パフォーマンスリフレクションを使用するため、相対的にパフォーマンスが低下します。実装アプローチを完全に制御できるため、必要なフィールドだけを処理するなど、高速化が可能です。
5継承とオブジェクトのシリアライズ1. スーパークラスがSerializableでなくても、サブクラスはシリアライズ可能です。
2. サブクラスがシリアライズ対象でない場合でも、スーパークラスは自動的にシリアライズされます。
同様の挙動はExternalizableにも適用できます。

Externalizableの実装例

class ExternalizableExample implements Externalizable {
    Integer id;

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeInt(id);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.id = in.readInt();
    }
}

この例では、writeExternal()idフィールドのみを書き出し、readExternal()で読み戻しています。保存したいフィールドを明示的に指定できるため、不要なデータを除外した効率的なシリアライズが実現できます。

Serializableの実装例

class SerializableExample implements Serializable {
    private static final long serialVersionUID = 5081877L;
    String name;
}

こちらは非常にシンプルです。Serializableを実装するだけで、特別なメソッドの実装は不要です。なお、serialVersionUIDはクラスのバージョン管理に使用される識別子であり、明示的に定義しておくことで、デシリアライズ時のクラス互換性チェックを安定させることが推奨されます。

どちらを使うべきか?

手軽さを重視する場合はSerializable、パフォーマンスや保存データの制御を重視する場合はExternalizableを選択するのが一般的です。大規模なオブジェクトグラフやネットワーク転送が頻繁なシステムでは、Externalizableによる最適化が有効なケースもあります。

  1. JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説

    はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati

  2. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って