概要
Javaのオブジェクトを直列化する際に、自由に書き出し、読み込みを制御できる方法である。
通常、JavaのシリアライゼーションはSerializable
インタフェースを実装することによって行われる。
カスタム・シリアライズは、全てのフィールドを書き出したくない場合や、特定の方法でカスタマイズしたい場合に使用する。
カスタム・シリアライズでは、以下のメソッドを使用して制御を行う。
-
private void writeObject(ObjectOutputStream out) throws IOException
:
シリアライズ(書き出し)時に自動的に呼び出されるメソッド。
引数としてObjectOutputStream
オブジェクトへの参照を受け取り、各データに応じたメソッドを使用して書き出したいフィールドを出力する。 -
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
:
デシリアライズ(読み込み)時に自動的に呼び出されるメソッド。
引数としてObjectInputStream
オブジェクトの参照を受け取り、各データに応じたメソッドを使用してデータを読み込む。
データの読み込み順は、writeObject
メソッドで書き出した順となる。
例(writeObject
メソッド)
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.IOException;
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("John Doe", 30);
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person);
System.out.println("Personオブジェクトがシリアライズされました。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
この例では、Person
クラスをシリアライズしてファイルに保存している。
Person
クラスはSerializable
インタフェースを実装しており、そのためObjectOutputStream
を使ってオブジェクトを直列化してファイルに保存できる。
例(readObject
メソッド)
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.io.IOException;
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class DeserializationExample {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Person deserializedPerson = (Person) in.readObject();
System.out.println("Personオブジェクトがデシリアライズされました。");
System.out.println("名前: " + deserializedPerson.getName());
System.out.println("年齢: " + deserializedPerson.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
この例では、先の例でシリアライズしたファイルを読み込んでデシリアライズし、元のPerson
オブジェクトを復元している。
Person
クラスはSerializable
インタフェースを実装しているため、ObjectInputStream
を使ってファイルからオブジェクトを読み込んでデシリアライズできる。