Java - シリアライゼーション
こんにちは、将来のJavaの魔法使いたち!今日、私たちはJavaシリアライゼーションのワンダーランドに興味深い旅に出かけます。プログラミングに新手であるのであれば心配しないでください - 私はあなたの友好的なガイドで、一歩一歩進んでいきましょう。このチュートリアルの終わりまでに、プロのようにオブジェクトをシリアライズすることができるようになります!
シリアライゼーションとは?
コードに飛び込む前に、シリアライゼーションが実際に何なのか理解しましょう。美味しいサンドイッチ(Javaの言葉ではオブジェクト)を友達に郵便で送りたいとしましょう。サンドイッチ全体を封筒に詰めることはできませんよね?代わりに、その材料を崩して、それを紙に書いて送る必要があります。友達がそれを受け取ると、指示に従ってサンドイッチを再現することができます。オブジェクトを簡単に保存したり送信したりできる形式に崩すプロセスがシリアライゼーションです。逆のプロセス - シリアライズされたデータからオブジェクトを再作成する - はデシリアライゼーションと呼ばれます。
シリアライゼーションがなぜ必要なのか?
Javaにおいてシリアライゼーションは以下の理由から非常に有用です:
- オブジェクトの状態を保存する:オブジェクトの状態を保存し、後で再作成することができます。
- ネットワーク通信:オブジェクトをネットワークを介して送信することができます。
- キャッシュ:シリアライズされたオブジェクトはキャッシュに保存され、素早くアクセスできます。
- ディープコピー:オブジェクトのディープコピーを作成する簡単な方法を提供します。
では、コードに取り組むことにしましょう!
Javaでのシリアライゼーションの仕組み
Javaでは、シリアライゼーションは言語に組み込まれているため、私たちの生活がかなり楽になります。オブジェクトをシリアライズ可能にするために、以下の2つのことを行う必要があります:
-
Serializable
インターフェースを実装する - オブジェクトのすべてのフィールドもシリアライズ可能であることを確認する
簡単なPerson
クラスを作成して説明しましょう:
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
この例では、Person
はSerializable
を実装しています。Serializable
インターフェースにはメソッドがありません - それは、Javaにこのクラスがシリアライズ可能であることを示すためのマーカーインターフェースです。
オブジェクトのシリアライズ
Person
クラスをお持ちできたので、オブジェクトをシリアライズしましょう:
import java.io.*;
public class SerializationDemo {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person);
System.out.println("Person object serialized and saved to person.ser");
} catch (IOException e) {
e.printStackTrace();
}
}
}
以下が起こっていることです:
-
Person
オブジェクトを作成します。 - "person.ser"という名前のファイルに書き込むために
FileOutputStream
を使用します。 -
FileOutputStream
をObjectOutputStream
にラップして、実際のシリアライズを行います。 -
writeObject()
を呼び出してPerson
オブジェクトをシリアライズします。 - ストリームが適切に閉じられるようにtry-with-resourcesブロックを使用します。
これを実行すると、"person.ser"という名前のファイルが作成され、シリアライズされたPerson
オブジェクトが含まれます。
オブジェクトのデシリアライズ
では、オブジェクトをデシリアライズしましょう:
import java.io.*;
public class DeserializationDemo {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Person person = (Person) in.readObject();
System.out.println("Deserialized Person object:");
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
以下が起こっていることです:
- "person.ser"から読むために
FileInputStream
を使用します。 - それをデシリアライズのために
ObjectInputStream
にラップします。 -
readObject()
を呼び出してオブジェクトをデシリアライズし、Person
にキャストします。 - デシリアライズされたオブジェクトを出力します。
これを実行すると、元のPerson
オブジェクトが表示されます!
Javaでのシリアライゼーションに関する重要なポイント
-
SerialVersionUID: シリアライゼーションのバージョン管理のために、クラスに
serialVersionUID
を定義することができます:
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
// ... クラスの残り部分
}
-
Transientフィールド: シリアライズされたくないフィールド(例えば、機密データ)を
transient
としてマークすることができます:
public class Person implements Serializable {
private String name;
private int age;
private transient String password; // これはシリアライズされません
// ... クラスの残り部分
}
-
シリアライゼーションのカスタマイズ: クラスに
writeObject()
およびreadObject()
メソッドを実装することでシリアライゼーションプロセスをカスタマイズすることができます。
シリアライズおよびデシリアライズのためのメソッド
以下は、シリアライズおよびデシリアライズに使用される主要なメソッドの表です:
メソッド | 説明 |
---|---|
ObjectOutputStream.writeObject(Object obj) |
オブジェクトをシリアライズ |
ObjectInputStream.readObject() |
オブジェクトをデシリアライズ |
Externalizable.writeExternal(ObjectOutput out) |
カスタムシリアライズメソッド |
Externalizable.readExternal(ObjectInput in) |
カスタムデシリアライズメソッド |
結論
おめでとうございます!あなたはまさにJavaシリアライゼーションの世界に踏み込みました。私たちはシリアライゼーションが何であるか、なぜ有用であるか、そしてJavaでどのように実装するかをカバーしました。練習は成功のみをもたらすので、異なるオブジェクトやシナリオで実験をすることを恐れないでください。
Javaの旅を続ける中で、シリアライゼーションはさまざまな文脈で登場します - ゲームの状態を保存することからネットワークを介してデータを送信することまで。それはあなたのプログラミングツールキットにおける強力なツールです。
コードを書き続け、学び続け、最も重要なのは楽しむことを忘れないでください!いつかは、バーチャルな世界全体をシリアライズする日が来るかもしれません。その日までに、楽しいコーディングを続けてください!
Credits: Image by storyset