我有一个具有公共基类的对象列表,我尝试使用 jaxb 将其序列化为 XML。我希望在编组时使用派生类的注释,但我在实现这一点时遇到了麻烦。
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;
public class Runner {
@XmlRootElement(name="base")
public static abstract class Base {
public int baseValue;
public Base() {
this.baseValue = 0;
}
}
@XmlRootElement(name="derived")
public static class Derived extends Base {
public int derivedValue;
public Derived() {
super();
this.derivedValue = 1;
}
}
@XmlRootElement(name="derived2")
public static class Derived2 extends Base {
public int derivedValue;
public Derived() {
super();
this.derivedValue = 1;
}
}
@XmlRootElement(name="base_list")
public static class BaseList {
public List<Base> baseList;
}
public static void main(String[] args) throws JAXBException {
BaseList baseList = new BaseList();
baseList.baseList = Arrays.asList((Base) new Derived(), (Base) new Derived());
JAXBContext jaxbContext = JAXBContext.newInstance(BaseList.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.marshal(baseList, System.out);
}
}
我想:
<base_list>
<derived>
<baseValue>0</baseValue>
<derivedValue>1</derivedValue>
</derived>
<derived2>
<baseValue>0</baseValue>
<derivedValue>1</derivedValue>
</derived2>
</base_list>
然而,上面的代码给出了:
<base_list>
<baseList>
<baseValue>0</baseValue>
</baseList>
<baseList>
<baseValue>0</baseValue>
</baseList>
</base_list>
有什么办法强制它使用派生类吗?在实际情况中,我不提前知道可能从 Base 派生的类。
请注意,我只需要封送数据,而不需要解封数据。
您可以使用@XmlElementRef
注释来处理这个用例。@XmlElementRef
对应于 XML 模式中替换组的概念。
举个例子:
- http://bdoughan.blogspot.com/2010/11/jaxb-and-inheritance-using-substitution.html http://bdoughan.blogspot.com/2010/11/jaxb-and-inheritance-using-substitution.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)