gpt4 book ai didi

java - JAXB 编码声明的父类与实际运行时子类

转载 作者:搜寻专家 更新时间:2023-10-31 19:50:37 25 4
gpt4 key购买 nike

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

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

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

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

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

JAXB inheritance, unmarshal to subclass of marshaled class

谢谢,

克里斯

最佳答案

我将使用这些类作为示例:

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

您通过 @XmlSeeAlso 注释告诉 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>

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

关于java - JAXB 编码声明的父类与实际运行时子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3155230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com