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化が完了。