XML serialization

DTDとかスキーマを用意せずに、JavaオブジェクトをXMLシリアライズするには標準のXMLEncoderがありますが、出力されたXMLがどうにも見にくい。
そこで、CastorXML*1が比較的見やすいのでいつも使ってましたが、Mapとかシリアライズするとかなり冗長でした。最近、Xstream*2をトライしてみたら、これが必要最低限の非常に見やすいXMLを出してくれます。いい感じです。CastorXMLみたいにXercesが必要ないので、気軽に使えます(標準はXPPですが、JAXPのDOMでもいけます)。その差歴然。


XMLEncoder

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.4.2_05" class="java.beans.XMLDecoder"> 
 <object class="faiz.xstream.Company"> 
  <void property="id"> 
   <int>1</int> 
  </void> 
  <void property="name"> 
   <string>Ueda Company</string> 
  </void> 
  <void property="person"> 
   <void method="put"> 
    <string>2</string> 
    <object class="faiz.xstream.Person"> 
     <void property="id"> 
      <int>2</int> 
     </void> 
     <void property="name"> 
      <string>Suzuki</string> 
     </void> 
    </object> 
   </void> 
   <void method="put"> 
    <string>1</string> 
    <object class="faiz.xstream.Person"> 
     <void property="id"> 
      <int>1</int> 
     </void> 
     <void property="name"> 
      <string>Tanaka</string> 
     </void> 
    </object> 
   </void> 
  </void> 
 </object> 
</java> 


CastorXML

<?xml version="1.0" encoding="UTF-8"?>
<company id="1">
    <person xsi:type="java:org.exolab.castor.mapping.MapItem" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <key xsi:type="java:java.lang.String">2</key>
        <value id="2" xsi:type="java:faiz.xstream.Person">
            <name>Suzuki</name>
        </value>
    </person>
    <person xsi:type="java:org.exolab.castor.mapping.MapItem" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <key xsi:type="java:java.lang.String">1</key>
        <value id="1" xsi:type="java:faiz.xstream.Person">
            <name>Tanaka</name>
        </value>
    </person>
    <name>Ueda Company</name>
</company>


Xstream

<faiz.xstream.Company>
  <name>Ueda Company</name>
  <id>1</id>
  <person>
    <entry>
      <string>2</string>
      <faiz.xstream.Person>
        <name>Suzuki</name>
        <id>2</id>
      </faiz.xstream.Person>
    </entry>
    <entry>
      <string>1</string>
      <faiz.xstream.Person>
        <name>Tanaka</name>
        <id>1</id>
      </faiz.xstream.Person>
    </entry>
  </person>
</faiz.xstream.Company>


Company.java

public class Company {
    private String name;
    private int id;
    private Map person = new HashMap();

    setter/getter...
}


Person.java

public class Person {
    private String name;
    private int id;

    setter/getter...
}


XstreamTest.java

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class XstreamTest {

    public static void main(String[] args) {
        XStream xstream = new XStream(new DomDriver());
        
        Company c = new Company();
        c.setId(1);
        c.setName("Ueda Company");

        Person p;
        p = new Person();
        p.setId(1);
        p.setName("Tanaka");
        c.getPerson().put("1", p);

        p = new Person();
        p.setId(2);
        p.setName("Suzuki");
        c.getPerson().put("2", p);
        
        System.out.println(xstream.toXML(c));
    }
}