前回に引き続きSimpleをもう少し試していきます。
ネストしたオブジェクトのシリアライズ
もちろんオブジェクトがネストされてても問題なくシリアライズできます。
Inner を内部に持つクラス
import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; import org.simpleframework.xml.Root; @Root public class Outer { @Element private Inner inner; @Attribute private int index; public Outer(){} public Outer(Inner inner, int index) { this.inner = inner; this.index = index; } public Inner getInner() { return inner; } public int getId() { return index; } }
Inner の内部のクラス
import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; public class Inner { @Element private String text; @Attribute private int index; public Inner(){} public Inner(String text, int index) { this.text = text; this.index = index; } public String getMessage() { return text; } public int getId() { return index; } }
実行コード
@Test public void testSerializ() throws Exception { Serializer serializer = new Persister(); serializer.write(new Outer(new Inner("message",9), 99), new File("nested_example.xml")); }
実行結果
以下のようなXMLファイルが出力されます。
<outer index="99"> <inner index="9"> <text>message</text> </inner> </outer>
任意属性の指定方法
@Element や @Attribute には(required=false)とすることで任意属性であることを指定できます。
@Root public class Optional { @Attribute private int id; @Element private String name; @Attribute(required=false) private Integer version; @Element(required=false) private String text; public Optional(){} public Optional(int id, String name) { this(id, name, null, null); } public Optional(int id, String name, Integer version, String text) { this.id = id; this.name = name; this.version = version; this.text = text; } ・・・
以下のようにrequired=falseを指定したフィールドに値を設定しない場合、
@Test public void testSerializ() throws Exception { Serializer serializer = new Persister(); serializer.write(new Optional(99, "message"), new File("optional_example.xml")); }
実行結果は以下のようになります。
<optional id="99"> <name>message</name> </optional>
required=falseを指定したフィールドに値を設定した場合、
@Test public void testSeriali2z() throws Exception { Serializer serializer = new Persister(); serializer.write(new Optional(99, "message", 2, "text"), new File("optional_example.xml")); }
実行結果は以下のように、先ほど出力されなかった属性が出力されます。
<optional id="99" version="2"> <name>message</name> <text>text</text> </optional>
コレクション
要素としてコレクションを持つクラスをシリアライズしてみます。リストの場合は、@ElementListアノテーションを使います。配列には @ElementArray Mapには @ElementMap を使用します。
Listの例を試してみます。
import org.simpleframework.xml.Attribute; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.Root; @Root public class ListExample { @ElementList private List<Entry> list; @Attribute private String name; public ListExample() {} public ListExample(List<Entry> list, String name) { this.list = list; this.name = name; } public String getName() { return name; } public List<Entry> getProperties() { return list; } }
リストの中身のEntry
import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; import org.simpleframework.xml.Root; @Root public class Entry { @Attribute private String key; @Element private String value; public Entry() {} public Entry(String key, String value) { this.key = key; this.value = value; } public String getKey() { return key; } public String getValue() { return value; } }
実行コード
@Test public void tearList() throws Exception { List<Entry> l = new ArrayList<Entry>(); l.add(new Entry("key1", "val1")); l.add(new Entry("key2", "val2")); l.add(new Entry("key3", "val3")); ListExample example = new ListExample(l, "LIST"); new Persister().write(example, new File("list_example.xml")); }
実行結果
以下のようなXMLファイルが出力されます。
<listExample name="LIST"> <list class="java.util.ArrayList"> <entry key="key1"> <value>val1</value> </entry> <entry key="key2"> <value>val2</value> </entry> <entry key="key3"> <value>val3</value> </entry> </list> </listExample>