問題を示す簡単な例を次に示します。
Alpha と Beta の 2 つの Bean クラスを考えてみましょう。
public class Alpha {
private String name;
private Beta beta;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Beta getBeta() {
return beta;
}
public void setBeta(Beta beta) {
this.beta = beta;
}
}
public class Beta {
private Alpha alpha;
public Alpha getAlpha() {
return alpha;
}
public void setAlpha(Alpha alpha) {
this.alpha = alpha;
}
}
次に、Alpha と Beta のインスタンスが作成され、Alpha オブジェクトが XML に書き込まれます。
Alpha alpha = new Alpha();
Beta beta = new Beta();
alpha.setBeta(beta);
alpha.setName("Rama");
beta.setAlpha(alpha);
XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("file.xml")));
encoder.writeObject(alpha);
encoder.close();
Java 6 では、次の XML になります。
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_24" class="java.beans.XMLDecoder">
<object id="Alpha0" class="dk.kruger.Alpha">
<void property="beta">
<object class="dk.kruger.Beta">
<void property="alpha">
<object idref="Alpha0"/>
</void>
</object>
</void>
<void property="name">
<string>Rama</string>
</void>
</object>
</java>
しかし、Java 7 では結果は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_07" class="java.beans.XMLDecoder">
<object class="dk.kruger.Alpha" id="Alpha0">
<void property="beta">
<object class="dk.kruger.Beta">
<void property="alpha">
<object idref="Alpha0">
<void property="name">
<string>Rama</string>
</void>
</object>
</void>
</object>
</void>
</object>
</java>
Java 7 によって生成された XML は、Java 6 の XML よりもはるかに可読性が低くなります (特に、より複雑な例の場合)。上記の例では、Java 7 エンコーダーは「ベータ」の定義内で「アルファ」の「名前」プロパティを定義します。これは、「ベータ」が「アルファ」への参照も持っているためです。この動作により、深くネストされた醜い XML が生成される可能性があります。
Java 7 の XML エンコーダーで Java 6 スタイルの XML を生成する方法はありますか?