我目前正在尝试使用JaxB但是我用一个相对简单的例子并不是很成功。我的例子如下:
public class A {
private String m_name;
}
public abstract class B_Base extends A {
}
public class B1 extends B_Base {
private String m_value1;
}
public class B2 extends B_Base {
private String m_value2;
}
我所有的尝试(甚至是编组)都失败了。我查看了Blaise Doughan的博客,其中包括http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html等文章,但它们似乎都没有对我的例子有所帮助。我当然可能误用了他的例子。在我看来,我的例子应该是JaxB中容易支持的东西 - 毕竟,java主要基于继承关系!
我很感激快速反应!
答案 0 :(得分:2)
您可以执行以下操作:
JAXBContext
,也可以在父类上使用@XmlSeeAlso
注释来引入子类。JAXBElement
。<强>演示强>
import javax.xml.bind.*;
import javax.xml.namespace.QName;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(B1.class, B2.class);
B1 b1 = new B1();
JAXBElement<A> jaxbElement = new JAXBElement<A>(new QName("root"), A.class, b1);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(jaxbElement, System.out);
}
}
<强>输出强>
以下是运行演示代码的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b1"/>
嗨,可能是一个非常愚蠢的问题,但只是想知道,我怎么样 如果我有一个包含A对象的ArrayList的类C,请调整它 (或子类)?
<强> C 强>
以下是评论中描述的C
课程:
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class C {
private List<A> as = new ArrayList<A>();
@XmlElement(name="a")
public List<A> getAs() {
return as;
}
}
<强> A 强>
以下是如何利用@XmlSeeAlso
注释引入子类。
@XmlSeeAlso({ B1.class, B2.class })
public class A {
private String m_name;
}
下面是一些显示一切正常的演示代码。现在注意我们使用@XmlSeeAlso
我们使用@XmlSeeAlso
我们在引导JAXBContext
时不需要包含子类。
<强>演示强>
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(C.class);
C root = new C();
root.getAs().add(new B1());
root.getAs().add(new B2());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
<强>输出强>
以下是运行演示代码的输出。
<?xml version="1.0" encoding="UTF-8"?>
<c>
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b1"/>
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b2"/>
</c>