JavaオブジェクトのXMLシリアライズ技術
システム間データ交換や設定ファイル管理において、JavaオブジェクトをXML形式に変換する処理は基盤技術として重要です。本稿では標準ライブラリを活用した変換手法を解説し、実用的なコード例を提示します。
DOM APIによる構造化出力
ドキュメント全体をメモリ上に構築するDOM方式では、階層構造の明示的な操作が可能です。以下の実装例ではPersonオブジェクトをXMLノードツリーに変換しています。
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.newDocument();
// ルート要素の作成
Element personNode = document.createElement("person");
document.appendChild(personNode);
// 子要素の追加
Element nameNode = document.createElement("name");
nameNode.setTextContent("山田太郎");
personNode.appendChild(nameNode);
Element ageNode = document.createElement("age");
ageNode.setTextContent("32");
personNode.appendChild(ageNode);
// ファイル出力
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(
new DOMSource(document),
new StreamResult(Paths.get("person.xml").toFile())
);
SAXイベント駆動型生成
メモリ効率に優れたSAX方式では、XML出力イベントを直接生成します。XMLWriterユーティリティを活用した実装例を示します。
XMLWriter writer = new XMLWriter(
new FileWriter("person.xml"),
new OutputFormat("XML", "UTF-8", true)
);
writer.startDocument();
writer.startElement("", "person", "person", new AttributesImpl());
writer.startElement("", "name", "name", new AttributesImpl());
writer.characters("山田太郎".toCharArray(), 0, 4);
writer.endElement("", "name", "name");
writer.startElement("", "age", "age", new AttributesImpl());
writer.characters("32".toCharArray(), 0, 2);
writer.endElement("", "age", "age");
writer.endElement("", "person", "person");
writer.endDocument();
JAXBによるアノテーション駆動変換
Javaアーキテクチャ標準であるJAXBでは、クラス定義にアノテーションを付与する宣言的アプローチが可能です。
@XmlRootElement(name = "person")
public class PersonEntity {
@XmlElement(name = "name")
private String fullName;
@XmlElement(name = "age")
private int years;
// デフォルトコンストラクタ必須
public PersonEntity() {}
// ゲッター/セッター
public String getFullName() { return fullName; }
public void setFullName(String name) { fullName = name; }
public int getYears() { return years; }
public void setYears(int age) { years = age; }
}
// 変換処理
PersonEntity person = new PersonEntity();
person.setFullName("山田太郎");
person.setYears(32);
JAXBContext context = JAXBContext.newInstance(PersonEntity.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.marshal(person, new File("person.xml"));