XMLEncoderを使ってみる

壁紙チェンジャーShuffleWallpaperに複数フォルダ指定の機能を追加するにあたり、指定された複数フォルダをどう設定ファイルに保存するか、という問題がある。
今はjava.util.Propertiesの「<キー>=<値>」形式の行が並ぶ設定ファイルだが、複数フォルダ指定を覚えておくには、この形式だとちょっとつらくなってくる。そこでjava.beans.XMLEncoderとXMLDecorderを使い、XML形式で格納することにした。
XMLEncoderを使うと、以下のようなコードでJavaBeansオブジェクトをXML形式でOutputStreamに出力することができる。

FileOutputStream out = new FileOutputStream("configuration.xml");
XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(out));
encoder.writeObject(this); // thisは設定情報を表すConfiguration オブジェクト
encoder.close();

出力されたファイルは、下記のようになる。

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.5.0" class="java.beans.XMLDecoder"> 
 <object class="nat.sw.Configuration"> 
  <void property="backgroundColor"> 
   <object class="java.awt.Color"> 
    <int>0</int> 
    <int>128</int> 
    <int>128</int> 
    <int>255</int> 
   </object> 
  </void> 
  <void property="intervalRunning"> 
   <boolean>true</boolean> 
  </void> 
  <void property="shuffleIntervalMinute"> 
   <long>15</long> 
  </void> 
  <void property="wallpaperDirectory"> 
   <string>C:\wallpaper</string> 
  </void> 
 </object> 
</java> 

XMLDecorderは、逆にInputStreamから読み込んだXMLからオブジェクトを復元する。
XML形式にするオブジェクトはJavaBeansでないといけない*1という制約はあるけど、単純なデータクラスならそのままJavaBeansになることが多いし、XML形式だと直接テキストエディタで編集できるので便利。
設定情報を表すConfigurationをJavaBeanにするために、少し手直しが必要だったが、このXMLEncoderとXMLDecorderを使って、設定ファイルのXML化が完了。

*1:引数なしコンストラクタが必要、getter/setterメソッドを提供する、などの性質を持たせる必要がある