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

2023-12-24

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

XML 输出显示正在封送 Foo 的实例而不是 FooBar。在注释方面我必须做一些具体的事情来告诉 JAXB 如何正确地编组运行时子类来代替声明的超类?

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

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

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

JAXB 继承,解组到编组类的子类 https://stackoverflow.com/questions/619761/jaxb-inheritance-unmarshal-to-subclass-of-marshaled-class

Thanks,

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

您通过以下方式告诉 JAXB 有关其他类的信息@XmlSeeAlso注解。

@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>

它并不漂亮,但类型信息被保留。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAXB 编组声明的父类与实际运行时子类 的相关文章

随机推荐