シリアライズとデシリアライズ
シリアライズ
メモリ上にあるインスタンスをストリームとして出力すること。
これにより、オブジェクトをファイルに保存したり、ネットワーク経由で送信したりすることができる。
特徴
- データの永続化:オブジェクトをファイルに保存することで、後で再び読み込むことができる。
- ネットワーク通信:オブジェクトをバイトストリームに変換して送信することで、別のプログラムや別のマシンとデータをやり取りできる。
デシリアライズ
ファイルに書き出された情報を元にインスタンスを作り直すこと。
これにより、ファイルから保存したオブジェクトを読み込んだり、ネットワーク経由で受信したデータを元のオブジェクトに戻したりすることが可能となる。
シリアライズ、デシリアライズを行う場合、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のひとつである。