0
0

More than 1 year has passed since last update.

【JavaGold】カスタム・シリアライズ

Posted at

概要

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を使ってファイルからオブジェクトを読み込んでデシリアライズできる。

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