Simpleライブラリの検証(3)
ざっくりと試してみたSimpleライブラリ。
いろいろと気になる点もあったので、ざくっと検証してみる。の続き。
Javaフィールドの値がnullの場合の扱い
当然のことながら、すべてのJavaフィールドの値がnullでないということはなく、「nullの場合にはXMLの要素として出力しない」などのようなケースはありうる。
次のようなファイル「person-2-1.xml」を用意する。
<personName> <firstName>Jiro</firstName> <lastName>Suzuki</lastName> </personName>
さらに次のようなMainクラスを用意。
import java.io.File; import org.simpleframework.xml.Serializer; import org.simpleframework.xml.core.Persister; public class Main { /** * @param args */ public static void main(String[] args) { try { Serializer serializer = new Persister(); PersonName testPojo = newPersonName(); File result = new File("data/person-1-1.xml"); System.out.println(" " + result); serializer.write(testPojo, result); } catch (Exception e) { e.printStackTrace(System.out); } try { Serializer serializer = new Persister(); File source = new File("data/person-2-1.xml"); System.out.println(" " + source); PersonName testPojo = serializer.read(PersonName.class, source); dumpPersonName(testPojo); } catch (Exception e) { e.printStackTrace(System.out); } } private static PersonName newPersonName() { PersonName personName = new PersonName(); personName.setFirstName("Taro"); personName.setLastName("Yamada"); return personName; } private static void dumpPersonName(PersonName personName) { System.out.println(" firstName: " + personName.getFirstName()); System.out.println(" lastName: " + personName.getLastName()); System.out.println(" middleName: " + personName.getMiddleName()); } }
PersonNameクラスは次のとおり。
import org.simpleframework.xml.Element; import org.simpleframework.xml.Root; @Root public class PersonName { @Element private String firstName; @Element private String lastName; @Element private String middleName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } }
で、これを実行すると、期待通り(!?)次のようなエラーが発生する。
=== serialize === data\person-1-1.xml org.simpleframework.xml.core.ElementException: Value for @org.simpleframework.xml.Element(required=true, data=false, name=) on field 'middleName' private java.lang.String PersonName.middleName is null at org.simpleframework.xml.core.Composite.writeElements(Composite.java:1023) : === deserialize === data\person-2-1.xml org.simpleframework.xml.core.ValueRequiredException: Unable to satisfy @org.simpleframework.xml.Element(required=true, data=false, name=) on field 'middleName' private java.lang.String PersonName.middleName for class PersonName at line -1 at org.simpleframework.xml.core.Composite.validate(Composite.java:646) :
ElementアノテーションのJavaDocを見てみると、required要素が利用できることがわかる。
そこで、PersonNameクラスを次のように書き換える。
import org.simpleframework.xml.Element; import org.simpleframework.xml.Root; @Root public class PersonName { @Element private String firstName; @Element private String lastName; @Element(required=false) private String middleName; // 以下略
フィールド「middleName」につけるElementアノテーションに「required=false」を指定した。
これを実行すると次のようになる。
=== serialize === data\person-1-1.xml === deserialize === data\person-2-1.xml firstName: Jiro lastName: Suzuki middleName: null
で、person-1-1.xml の内容は次のようになっている。
<personName> <firstName>Taro</firstName> <lastName>Yamada</lastName> </personName>
期待通りの結果。
Attributeなどその他のアノテーションでも同様にrequiredを指定することができる。