Java JAXB编组声明的父类与实际运行时子类

Java JAXB编组声明的父类与实际运行时子类,java,jaxb,subclass,Java,Jaxb,Subclass,我使用JAXB封送一个类,该类有一个声明为类Foo的实例变量。在运行时,该实例变量被设置为Foo子类的一个实例,比如FooBar。类Foo和FooBar上都有基本的JAXB注释 XML输出显示正在封送一个Foo实例而不是FooBar。在注释方面,我是否需要做一些特定的事情来告诉JAXB如何正确封送运行时子类而不是声明的超类 我尝试了一个实验,在这个实验中,我直接封送了一个foo类型的实例变量foo,该变量在运行时被设置为FooBar的一个实例。它正确地封送了一个FooBar实例 这显然不同于封送

我使用JAXB封送一个类,该类有一个声明为类Foo的实例变量。在运行时,该实例变量被设置为Foo子类的一个实例,比如FooBar。类Foo和FooBar上都有基本的JAXB注释

XML输出显示正在封送一个Foo实例而不是FooBar。在注释方面,我是否需要做一些特定的事情来告诉JAXB如何正确封送运行时子类而不是声明的超类

我尝试了一个实验,在这个实验中,我直接封送了一个foo类型的实例变量foo,该变量在运行时被设置为FooBar的一个实例。它正确地封送了一个FooBar实例

这显然不同于封送包含Foo类型的实例变量的类,因为封送调用是在包含类上进行的,JAXB只是封送这些类的字段(我使用@XmlAccessorType(XmlAccessType.FIELD)注释)

我的期望是JAXB能够正确地检查实例变量的运行时类型,但情况可能并非如此。这种情况是否需要使用这里描述的XmlAdapter实现

谢谢


Chris

我将以这些类为例:

@XmlRootElement
class Foo { public Bar bar; }
class Bar {}
class Baz extends Bar {}
class Quux extends Bar {}
嗯,似乎有两种可能的解决办法:

您可以在上下文创建时告诉JAXB所有涉及的类(包括子类)

JAXBContext.newInstance(Foo.class, Bar.class, Baz.class, Quux.class);
您可以通过
@xmlseea
注释向JAXB介绍其他类

@XmlRootElement
@XmlSeeAlso({Baz.class, Quux.class})
class Foo { public Bar bar; }
如果你像这样指挥

Foo f = new Foo();
f.bar = new Baz();

m.marshal(f, System.err);
你收到

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
    <bar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="baz"/>
</foo>

它并不漂亮,但是类型信息被保留了下来