XMLEncoder が作成する XML には Bean のすべてのプロパティの値が書き出されるとは限りません。 保存する Bean のプロパティの値とその Bean がデフォルトコンストラクタで作成された直後のプロパティの値を比べて等価でない場合にのみ XML にそのプロパティの値が書き出されます。 復元はデフォルトコンストラクタでオブジェクトを生成してから XML に書き出されたプロパティを設定することで行えます。 デフォルトコンストラクタ実行直後の状態から変更のあるプロパティのみを XML に書き出すことにより XML のサイズは一般にコンパクトになりますが、この XML は大抵の場合 Bean のすべてを表現していないので XMLDecoder で復元する以外には使い道は少ないと思います。
下のプログラムでは SampleBean の value というプロパティはコンストラクタ実行後の値と同じままなので XML には書き出されていません。
/******************** EncodeTest.java ********************/
import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
public class EncodeTest {
public static void main(String[] args) throws FileNotFoundException {
SampleBean bean = new SampleBean();
bean.getFoo().setText("aaa");
XMLEncoder encoder = new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream("sample.xml")));
encoder.writeObject(bean);
encoder.close();
}
}
/******************** 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">
<void property="text">
<string>aaa</string>
</void>
</void>
</object>
</java>
/******************** SampleBean ********************/
public class SampleBean {
private int value = -1;
private Foo foo = new Foo();
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
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 setText(String text) {
this.text = text;
}
}