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

Lin*_*e81 6 java jaxb xml-serialization

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

这可能吗?

谢谢

bdo*_*han 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

儿童

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

演示

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

<child>
    <childProp>child-value</childProp>
    <parentProp>parent-value</parentProp>
</child>
Run Code Online (Sandbox Code Playgroud)