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)); } }