Java JAXB继承-非抽象基类
我目前正在尝试使用JaxB,但对于一个相对简单的示例,我并不是很成功。我的例子如下:Java JAXB继承-非抽象基类,java,xml,inheritance,jaxb,Java,Xml,Inheritance,Jaxb,我目前正在尝试使用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
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的博客,其中包括一些文章,如,但没有一篇对我的例子有帮助。我很可能误用了他的例子。在我看来,我的示例应该是JaxB中易于支持的—毕竟,java主要基于继承关系
如果您能快速回复,我将不胜感激 您可以执行以下操作:
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;
}
- JAXB将引入超类,但不会引入子类。您可以在叶类上创建
,也可以在父类上使用JAXBContext
注释来拉入子类@xmlsee
- 您需要提供根元素信息。下面我用
完成了这项工作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);
}
}
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);
}
}
A
下面是如何利用@xmlseea
注释引入子类
@XmlSeeAlso({ B1.class, B2.class })
public class A {
private String m_name;
}
演示代码
下面是一些演示代码,展示了一切工作原理。请注意,现在我们使用@xmlseea
我们使用@xmlseea
引导JAXBContext
时不需要包含子类
演示
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);
}
}
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>
上述类的jaxb注释在哪里?您还可以添加示例代码,说明如何封送/取消封送问题中提到的类吗?我已经尝试了大量不同的注释安排,我不想让人们对各种尝试感到厌烦。然而,如果你这么想,我可以举一个例子,这可能是一个非常愚蠢的问题,但我只是想知道,如果我有一个C类,它包含一个对象(或子类)的ArrayList,我将如何调整它?非常感谢你的努力!!明天早上我会试一试的!