読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

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を指定することができる。