0
0

More than 1 year has passed since last update.

【JavaGold】Serializableインタフェース

Posted at

シリアライズとデシリアライズ

シリアライズ

メモリ上にあるインスタンスをストリームとして出力すること。
これにより、オブジェクトをファイルに保存したり、ネットワーク経由で送信したりすることができる。

特徴
  • データの永続化:オブジェクトをファイルに保存することで、後で再び読み込むことができる。
  • ネットワーク通信:オブジェクトをバイトストリームに変換して送信することで、別のプログラムや別のマシンとデータをやり取りできる。

デシリアライズ

ファイルに書き出された情報を元にインスタンスを作り直すこと。
これにより、ファイルから保存したオブジェクトを読み込んだり、ネットワーク経由で受信したデータを元のオブジェクトに戻したりすることが可能となる。

シリアライズ、デシリアライズを行う場合、Serializableインタフェースを実装したクラスを使用する。

Serializableインタフェース

オブジェクトのシリアライズ(直列化1)を行うインタフェースである。

import java.io.Serializable;

public class MyClass implements Serializable {
    // クラスの定義
}

ただし、Serializableインタフェースを実装すると、クラスのフィールドも直列化される。
フィールドがSerializableインタフェースを実装していない場合、直列化の際に例外が発生することがある。

例(Serializableインタフェースが未実装の場合)
import java.io.Serializable;

// シリアライズ可能なクラス
class Person implements Serializable {
    private String name;
    private int age;
    private Address address; // AddressクラスがSerializableを実装していない

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public Address getAddress() {
        return address;
    }
}

// シリアライズ不可能なクラス
class Address {
    private String city;
    private String street;

    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public String getStreet() {
        return street;
    }
}

上記の例では、PersonクラスはSerializableインタフェースを実装しているが、AddressクラスはSerializableを実装していない。
この場合、Personオブジェクトをシリアライズしようとすると、以下のような例外が発生する。

java.io.NotSerializableException: Address

これはAddressクラスがSerializableを実装していないため、Personクラスをシリアライズする際にAddressオブジェクトもシリアライズできない場合に発生するエラーである。
このような場合、AddressクラスもSerializableインタフェースを実装する必要がある。

例(Serializableインタフェースを実装した場合)
import java.io.Serializable;

// シリアライズ可能なクラス
class Person implements Serializable {
    private String name;
    private int age;
    private Address address;

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public Address getAddress() {
        return address;
    }
}

// シリアライズ可能なクラス
class Address implements Serializable {
    private String city;
    private String street;

    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public String getStreet() {
        return street;
    }
}

実装することにより、Personクラスをシリアライズする際にはAddressオブジェクトも正常にシリアライズできるようになる。

このように「このクラスはシリアライズしなければならない」ことを示すのがSerializableインタフェースであり、マーカーインタフェース2のひとつである。

  1. 複数のインスタンスを1つにまとめること。

  2. メソッドの宣言を含まず、単にクラスに特定の機能を提供するために実装される空のインタフェースのこと。
    クラスに何らかの意味を追加するために利用する。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0