与Java6相比,XMLEncoder在Java7中生成的人类可读XML更少

与Java6相比,XMLEncoder在Java7中生成的人类可读XML更少,java,xml,java-7,java-6,xmlencoder,Java,Xml,Java 7,Java 6,Xmlencoder,下面是一个简单的示例,演示了该问题: 考虑两个bean类Alpha和Beta: public class Alpha { private String name; private Beta beta; public String getName() { return name; } public void setName(String name) { this.name = name; } public

下面是一个简单的示例,演示了该问题:

考虑两个bean类Alpha和Beta:

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>

拉玛
与Java6XML相比,Java7生成的XML的可读性要差得多(当然,对于更复杂的示例,尤其如此)。在上面的示例中,Java7编码器在“beta”的定义中定义了“alpha”的“name”属性,因为“beta”还引用了“alpha”。这种行为可能会导致深度嵌套和丑陋的XML


有没有办法让Java7中的XML编码器生成Java6风格的XML?

encoder.writeObject(alpha);阿尔法指向贝塔,贝塔指向阿尔法。这里有一个循环依赖。是的,但不要认为这是问题所在。如果仔细观察,您将看到Alpha的属性“name”现在隐藏在Beta中对Alpha的引用中,而不是在Alpha本身中。似乎有一些改变,使所有的结束标签去底部。询问者:您是否考虑过使用XStream之类的东西来创建xml?