Javaのシリアライズとデシリアライズのサンプルです。
確認環境 ・Java 8 |
目次
サンプル | シリアライズとデシリアライズする対象のクラス |
serialVersionUID(シリアルバージョンUID) | |
サンプルコードの環境 | |
1.シリアライズとデシリアライズする対象のクラス | |
2.シリアライズするクラス | |
3.デシリアライズするクラス |
シリアライズとデシリアライズする対象のクラス
- シリアライズとは、Javaオブジェクトからバイト配列に変換しファイルなどに出力することです。
- デシリアライズとは、シリアライズ化されたファイルなどからJavaオブジェクトに復元することです。
- Serializableインターフェースを実装します。マーカーインターフェース(中身が空)のため実装が必要なメソッドはありません。
- 項目にtransientを付けるとシリアライズとデシリアライズの対象外になります。
- 以下はJava8 API仕様のSerializableインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/io/Serializable.html - 以下は、Wikipediaのシリアライズのリンクです。
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA
serialVersionUID(シリアルバージョンUID)
serialVersionUID = 1525287529109561926L; |
- クラスの構造のバージョンを表します。変更があった場合、数値を変更します。
- 省略しても動きます。
- シリアライズした時のバージョンとデシリアライズする時のバージョンが異なっていた場合、デシリアライズできません。InvalidClassException例外が発生します。
- シリアライズのときに作成されるファイルの拡張子は.serがよく使用されます。
- EclipseにはシリアルバージョンUIDを自動で生成する方法があります。
Eclipse JavaのシリアルバージョンUIDを自動で生成する方法
サンプルコードの環境
サンプルコードとして3つのクラスがあります。(Color.java,Test1.java,Test2.java)
流れとして、以下の2つを行います。
1.Javaオブジェクトからシリアライズしてserファイルに値をセットする。
2.serファイルからデシリアライズしてJavaオブジェクトに値をセットする。
1.シリアライズとデシリアライズする対象のクラス
シリアライズとデシリアライズする対象のクラスです。
package test1;
import java.io.Serializable;
public class Color implements Serializable {
private static final long serialVersionUID = -5800142262424925545L;
private String color;
private transient int width;
Color() {
}
Color(String color, int width) {
this.color = color;
this.width = width;
}
public String getColor() {
return color;
}
public int getWidth() {
return width;
}
}
4行目は、Serializableインターフェースを実装しています。
6行目は、serialVersionUIDです。EclipseではserialVersionUIDを自動で生成できます。
Eclipse JavaのserialVersionUIDを自動生成する
8行目は、シリアライズとデシリアライズ対象の項目です。
10行目は、transientがついています。シリアライズとデシリアライズの対象外になります。
2.シリアライズするクラス
シリアライズするクラスのサンプルのコードです。
package test1;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Test1 {
public static void main(String[] args) {
String outFile = "D:\\Test1\\color1.ser";
Color c1 = new Color("red", 100);
System.out.println(c1.getColor()); //red
System.out.println(c1.getWidth()); //100
try(FileOutputStream fo = new FileOutputStream(outFile);
ObjectOutputStream objOut = new ObjectOutputStream(fo)){
objOut.writeObject(c1);
objOut.flush();
objOut.reset();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
12行目は、Javaオブジェクトを生成しています。
13,14行目は、Javaオブジェクトの値を確認しています。
18行目は、writeObjectメソッドはでJavaオブジェクトからファイルに出力しています。
16,17行目は、try-with-resources構文です。リソースを自動でクローズします。
serファイルの中身
出力されるserファイルの中身はバイナリになっています。
3.デシリアライズするクラス
デシリアライズするクラスのサンプルのコードです。
package test1;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Test2 {
public static void main(String[] args) {
String inFile = "D:\\Test1\\color1.ser";
Color c2 = new Color();
// デシリアライズする前のJavaオブジェクトの確認
System.out.println("before:" + c2.getColor()); //null
System.out.println("before:" + c2.getWidth()); //0
try(FileInputStream fi = new FileInputStream(inFile);
ObjectInputStream objIn = new ObjectInputStream(fi)){
c2 = (Color)objIn.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
// Javaオブジェクトの値の確認
System.out.println("after:" + c2.getColor()); //red
System.out.println("after:" + c2.getWidth()); //0
}
}
11行目は、Javaオブジェクトを生成しています。
13,14行目は、デシリアライズする前のJavaオブジェクトを確認しています。
18行目は、readObjectメソッドでファイルからJavaオブジェクトに出力しています。
28,29行目は、デシリアライズした後のJavaオブジェクトの値を確認しています。
項目のwidthは、transientのため値は0のままです。
16,17行目は、try-with-resources構文です。リソースを自動でクローズします。
ObjectOutputStreamクラス
public final void writeObject(Object obj) throws IOException |
public void flush() throws IOException |
public void reset() throws IOException |
- シリアライズで使用します。
- writeObjectメソッドは、オブジェクトをObjectOutputStreamに書き込みます。
- flushメソッドは、ストリームをフラッシュします。
- resetメソッドは、新しいObjectOutputStreamと同じ状態にリセットします。
- 以下はJava8 API仕様のObjectOutputStreamクラスのリンクです
https://docs.oracle.com/javase/jp/8/docs/api/java/io/ObjectOutputStream.html
ObjectInputStreamクラス
public final Object readObject() throws IOException,ClassNotFoundException |
- デシリアライズで使用します。
- readObjectメソッドは、ObjectInputStreamからオブジェクトを読み込みます。
- 以下はJava8 API仕様のObjectInputStreamクラスのreadObjectメソッドのリンクです
https://docs.oracle.com/javase/jp/8/docs/api/java/io/ObjectInputStream.html#readObject--
関連の記事