在Java序列化中排序xml超类元素

时间:2011-03-22 16:01:03

标签: java xml-serialization jaxb

我必须使用JAXB在JAVA中对ParentClass和ChildClass进行分类。 ChildClass扩展了ParentClass。 当我序列化ChildClass的一个对象时,在生成的XML中,ParentClass属性首先出现,我想首先使用ChildClass属性,然后是ParentClass属性。

这可能吗?

谢谢

1 个答案:

答案 0 :(得分:9)

JAXB执行此操作的原因是为了匹配XML模式中的继承。但是,您可以执行以下操作:

  • 标记父级@XmlTransient
  • 在子类
  • 上设置propOrder

<强>父

import javax.xml.bind.annotation.XmlTransient;

@XmlTransient
public abstract class Parent {

    private String parentProp;

    public String getParentProp() {
        return parentProp;
    }

    public void setParentProp(String parentProp) {
        this.parentProp = parentProp;
    }

}

儿童

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement
@XmlType(propOrder={"childProp", "parentProp"})
public class Child extends Parent {

    private String childProp;

    public String getChildProp() {
        return childProp;
    }

    public void setChildProp(String childProp) {
        this.childProp = childProp;
    }

}

<强>演示

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Child.class);

        Child child = new Child();
        child.setParentProp("parent-value");
        child.setChildProp("child-value");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(child, System.out);
    }

}

<强>输出

<child>
    <childProp>child-value</childProp>
    <parentProp>parent-value</parentProp>
</child>