【问题标题】:JAXB marshalling declared parent class vs. actual runtime subclassJAXB 编组声明的父类与实际运行时子类
【发布时间】:2011-03-10 11:21:21
【问题描述】:

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

XML 输出显示正在编组的是 Foo 的实例而不是 FooBar。在注释方面我需要做些什么来告诉 JAXB 如何正确编组运行时子类来代替声明的超类?

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

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

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

JAXB inheritance, unmarshal to subclass of marshaled class

谢谢,

克里斯

【问题讨论】:

    标签: java jaxb subclass


    【解决方案1】:

    我将以这些类为例:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多