【Java】JavaオブジェクトのXMLへの読み出し・書き出し

Javaオブジェクト⇔XML 変換方法

 * JavaのクラスライブラリXMLEncoderとXMLDecoderを使う

■ 使用上の注意

全て重要
 * Javaオブジェクトには、java.io.Serializableインターフェイスを実装する
 * デフォルトコンストラクタが必要
 * getter/setterを「get変数名」「set変数名」のように実装する
 * 変数の型がboolean型の場合は、「get変数名」の代わりに「is変数名」とすることもできる
   ※ Boolean型の場合は、「is変数名」にできない(ここで若干はまった)
 * 変数の型がboolean型で値が false の場合、XMLファイルに出力されない
   (Javaオブジェクトにしたらちゃんと値はfalseになっているから実用上問題ないと思うが)

■ サンプル

Person.java

* 対象となるオブジェクト
import java.io.Serializable;

public class Person implements Serializable {
  private static final long serialVersionUID = -6612003848170755511L;

  private String name;
  private int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return this.age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}

Main.java

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Main {
  /**
   * @param args
   */
  public static void main(String[] args) {

    Person[] people = new Person[2];
    people[0] = new Person("Mike", 23);
    people[1] = new Person("Tom", 31);

    // オブジェクトの書き出し
    XMLEncoder xMLEncoder = null;
    try {
      xMLEncoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("PersonObjects.xml")));

      xMLEncoder.writeObject(people);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } finally {
      if (xMLEncoder != null) {
        xMLEncoder.close();
      }
    }

    // オブジェクトの呼び出し
    Person[] peopleFromXml;
    XMLDecoder xMLDecoder = null;
    try {
      xMLDecoder = new XMLDecoder(new BufferedInputStream(new FileInputStream("PersonObjects.xml")));

      peopleFromXml = (Person[]) xMLDecoder.readObject();

      int index = 0;
      for (Person person : peopleFromXml) {
        index++;
        System.out.println("[" + String.valueOf(index) + "] Name = " + person.getName() + " Aget = "
            + String.valueOf(person.getAge()));
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } finally {
      if (xMLDecoder != null) {
        xMLDecoder.close();
      }
    }
  }
}

出力

PersonObjects.xml
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0" class="java.beans.XMLDecoder">
 <array class="com.sample.xml.Person" length="2">
  <void index="0">
   <object class="com.sample.xml.Person">
    <void property="age">
     <int>23</int>
    </void>
    <void property="name">
     <string>Mike</string>
    </void>
   </object>
  </void>
  <void index="1">
   <object class="com.sample.xml.Person">
    <void property="age">
     <int>31</int>
    </void>
    <void property="name">
     <string>Tom</string>
    </void>
   </object>
  </void>
 </array>
</java>
コンソール画面
[1] Name = Mike Aget = 23
[2] Name = Tom Aget = 31

■ 補足

 * 汎用的な実装は以下の関連記事を参照のこと
http://blogs.yahoo.co.jp/dk521123/36358058.html