java – JAXB编组声明父类与实际运行时子类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JAXB编组声明父类与实际运行时子类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1392字,纯文字阅读大概需要2分钟。
内容图文
![java – JAXB编组声明父类与实际运行时子类](/upload/InfoBanner/zyjiaocheng/828/d81741ca7fbf4520815ecfa0945e5419.jpg)
我正在使用JAXB编组一个具有声明为类Foo的实例变量的类.在运行时,实例变量被设置为Foo的子类的实例,让我们说FooBar.类Foo和FooBar上都有基本的JAXB注释.
XML输出显示正在封送Foo的实例而不是FooBar.是否有一些特定的东西我需要做注释告诉JAXB如何正确编组运行时子类来代替声明的超类?
我尝试了一个实验,其中我直接编组了一个Foo类型的实例变量foo,它在运行时被设置为FooBar的一个实例.它正确编组了一个FooBar实例.
这与编组包含Foo类型的实例变量的类明显不同,因为marshal调用是在包含类上进行的,而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编组声明父类与实际运行时子类全部内容,希望文章能够帮你解决java – JAXB编组声明父类与实际运行时子类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。