Java XMLEncoderでオブジェクトを保存、XMLDecoderで復元
JavaでオブジェクトをXML形式で保存するサンプルプログラムを紹介します。
XMLの出力にはjava.beans.XMLEncoderを使用します。
またjava.beans.XMLDecoderを使用し、保存したオブジェクトを復元するサンプルプログラムも同時に紹介します。
サンプルプログラム
- プライベートで宣言されたフィールドは、Getter及びSetterメソッドを定義すると保存されます。
- 変数に変更がある場合のみ、XMLファイルに保存されます。
- 保存するオブジェクトはjava.util.HashMapや、java.util.ArrayList等も指定できます。簡易的にオブジェクトの状態を保存しておくのに便利です。
// バイトデータをファイルに出力
fileStream = new FileOutputStream(path);
fileStream.write(xmlbuff);
fileStream.flush();
} finally {
if (enc != null) {
enc.close();
}
if (out != null) {
out.close();
}
if (fileStream != null) {
fileStream.close();
}
}
}
/**
* 指定したパス[path]のXMLファイルから、オブジェクトを復元します。
* ※XMLファイルはjava.beans.XMLEncoderで保存している必要があります。
* @param path オブジェクトが保存されているパス。
* @throws FileNotFoundException
* 指定されたパス名で示されるファイルが存在しない場合
*/
public static Object readXML(String path) throws FileNotFoundException {
XMLDecoder d = null;
try {
d = new XMLDecoder(new BufferedInputStream(
new FileInputStream(path)));
return d.readObject();
} finally {
if (d != null) {
d.close();
}
}
}
※保存するクラスのサンプルとして、以下のクラスを使用します。
実行結果
◆実行例
// XMLからFreeSoftクラスのインスタンスを復元
FreeSoft freeSoft2 = (FreeSoft)readXML(“C:\\FreeSoft.xml”);
System.out.println(“ソフト名:”+freeSoft2.getName());
System.out.println(“URL:”+freeSoft2.getUrl());
} catch (Exception e) {
e.printStackTrace();
}
}
◆出力結果
ソフト名:Chat&Messenger チャットもメッセンジャーも!! URL:https://chat-messenger.com/
◆C:\\FreeSoft.xmlの内容
<?xml version="1.0" encoding="UTF-8"?> <java version="1.5.0_08" class="java.beans.XMLDecoder"> <object class="FreeSoft"> <void property="name"> <string>Chat&Messenger チャットもメッセンジャーも!!</string> </void> <void property="url"> <string>https://chat-messenger.com/</string> </void> </object> </java>
利用する場合の注意点
便利な java.beans.XMLEncoder、 java.beans.XMLDecoder クラスですが、 Chat&Messenger で実践的に利用すると、極めてレアケースですが、java.beans.XMLEncoder でXMLへ出力時、ファイルが0バイトになる問題を確認しています。
0バイトのファイルを読み込むと「標準エラー出力」にParseExceptionが記録されます。
この原因はFileOutputStream のインスタンスを生成した時点で、ファイルは空になってしまいます。
FileOutputStream のインスタンス生成後、XMLデータを出力する前にJavaプロセスがシャットダウンされると発生すると考えています。
Chat&Messenger ではこの問題のため、バックアップファイルを作成し問題を回避しています。