Javaオブジェクトhttps://en.wikipedia.org/wiki/Serialization[Serialization]は、Javaオブジェクトをシリアル化するための手段として、Javaライブラリスタックによって提供されるAPIです。シリアライゼーションは、オブジェクトを書き込み可能なバイトストリームに変換するプロセスです。バイトストリームに変換されると、これらのオブジェクトをファイルに書き込むことができます。これの逆のプロセスをデシリアライゼーションと呼びます。
Javaオブジェクトは、そのクラスまたはスーパークラスのいずれかが
java.io.Serializable`インターフェースまたはそのサブインターフェース
java.io.Externalizable`を実装する場合、直列化可能です。
1. Javaオブジェクト
Person.java
package com.techfou; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; private String gender; Person() { }; Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } @Override public String toString() { return "Name:" + name + "\nAge: " + age + "\nGender: " + gender; } }
2. Javaでのオブジェクトの記述と読み込み
オブジェクトは
java.io.ObjectOutputStream`を使ってバイトストリームに変換できます。 `ObjectOutputStream`を使ってオブジェクトをファイルに書き込むことを可能にするためには、そのクラスが以下のクラス定義に示すような
Serializable`インタフェースを実装することが必須です。
Javaでオブジェクトを読むことは、 `ObjectOutputStreamObjectInputStream`を使ってオブジェクトを書くことと似ています。以下の例は、オブジェクトの書き込みとJavaでのオブジェクトの読み取りの完全なサイクルを示しています。
オブジェクトを読み込むと、 `ObjectInputStream`はすべての属性を、読み込みオブジェクトをキャストしようとしているクラスに直接マップしようとします。
それぞれのオブジェクトを正確にマップできない場合は、 `ClassNotFound`例外がスローされます。
ここで例を使って書き込みと読み取りのプロセスを理解しましょう。
上に示した `Person`クラスをオブジェクトとして使用しています。
WriterReader.java
package com.techfou; package com.mkyong; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class WriterReader { public static void main(String[]args) { Person p1 = new Person("John", 30, "Male"); Person p2 = new Person("Rachel", 25, "Female"); try { FileOutputStream f = new FileOutputStream(new File("myObjects.txt")); ObjectOutputStream o = new ObjectOutputStream(f); //Write objects to file o.writeObject(p1); o.writeObject(p2); o.close(); f.close(); FileInputStream fi = new FileInputStream(new File("myObjects.txt")); ObjectInputStream oi = new ObjectInputStream(fi); //Read objects Person pr1 = (Person) oi.readObject(); Person pr2 = (Person) oi.readObject(); System.out.println(pr1.toString()); System.out.println(pr2.toString()); oi.close(); fi.close(); } catch (FileNotFoundException e) { System.out.println("File not found"); } catch (IOException e) { System.out.println("Error initializing stream"); } catch (ClassNotFoundException e) { //TODO Auto-generated catch block e.printStackTrace(); } } }
上記のコードを実行すると、以下の出力が得られます。
Name:John Age: 30 Gender: Male Name:Rachel Age: 25 Gender: Female
参考文献
Java Docs]。
https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html
[ObjectInputStream
Java Docs]。
https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html
[ObjectOutputStream
Java Docs]
java.io
読み込みオブジェクト
リンク://タグ/シリアライゼーション/[シリアル化]リンク://タグ/書き込みオブジェクト/[書き込み
オブジェクト]