3

問題を示す簡単な例を次に示します。

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 を生成する方法はありますか?

4

0 に答える 0