Bits of Java (トップ)

目次  前へ  次へ

保存時に失われるオブジェクトの状態

基本的に XML に書き出すプロパティは setter メソッドと getter メソッドの両方がそろっている必要があります。 逆に言うと setter メソッドか getter メソッドのどちらかしかないプロパティや プロパティ以外のオブジェクトの状態はすべて失われます。

下のプログラムの場合は SampleBean のプロパティ foo がデフォルトコンストラクタ後の null から変更されているので XML に書き出されれます。 また Foo のプロパティ text の値も変更がありますが text には setter メソッドが無いので XML へは書き出されません。 よって復元時には SampleBean のプロパティ foo は Foo を デフォルトコンストラクタで生成した状態の値となり、保存時の text の値は失われています。

DecodeTest の実行結果は以下のように標準出力に表示されます。

decodedBean.getFoo() : none

/******************** Test.java ********************/
import java.beans.*;
import java.io.*;

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        SampleBean bean = new SampleBean();
        Foo foo = new Foo();
        foo.changeText("aaa");
        bean.setFoo(foo);

        XMLEncoder encoder = new XMLEncoder(
                                 new BufferedOutputStream(
                                     new FileOutputStream("sample.xml")));
        encoder.writeObject(bean);
        encoder.close();

        XMLDecoder decoder = new XMLDecoder(
                                 new BufferedInputStream(
                                     new FileInputStream("sample.xml")));
        SampleBean decodedBean = (SampleBean)decoder.readObject();
        decoder.close();
        System.out.println("decodedBean.getFoo() : " + decodedBean.getFoo());
    }
}

/******************** SampleBean ********************/
public class SampleBean {
  private Foo foo;
    public Foo getFoo() {
        return foo;
    }
    public void setFoo(Foo foo) {
        this.foo = foo;
    }
}

/******************** Foo.java ********************/
public class Foo {
    private String text = "none";
    public String getText() {
        return text;
    }
    public void changeText(String text) {
        this.text = text;
    }
    public String toString() {
    return text;
  }
}

/******************** sample.xml ********************/
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.5.0_01" class="java.beans.XMLDecoder">
 <object class="SampleBean">
  <void property="foo">
   <object class="Foo"/>
  </void>
 </object>
</java>