Java JAXB继承-非抽象基类

Java JAXB继承-非抽象基类,java,xml,inheritance,jaxb,Java,Xml,Inheritance,Jaxb,我目前正在尝试使用JaxB,但对于一个相对简单的示例,我并不是很成功。我的例子如下: public class A { private String m_name; } public abstract class B_Base extends A { } public class B1 extends B_Base { private String m_value1; } public class B2 extends B_Base { private String m

我目前正在尝试使用JaxB,但对于一个相对简单的示例,我并不是很成功。我的例子如下:

public class A {
   private String m_name;
}

public abstract class B_Base extends A {

}

public class B1 extends B_Base {
   private String m_value1;
}

public class B2 extends B_Base {
   private String m_value2;
}
我所有的尝试(甚至编组)都失败了。我浏览了Blaise Doughan的博客,其中包括一些文章,如,但没有一篇对我的例子有帮助。我很可能误用了他的例子。在我看来,我的示例应该是JaxB中易于支持的—毕竟,java主要基于继承关系


如果您能快速回复,我将不胜感激

您可以执行以下操作:

public class A {
   private String m_name;
}

public abstract class B_Base extends A {

}

public class B1 extends B_Base {
   private String m_value1;
}

public class B2 extends B_Base {
   private String m_value2;
}
  • JAXB将引入超类,但不会引入子类。您可以在叶类上创建
    JAXBContext
    ,也可以在父类上使用
    @xmlsee
    注释来拉入子类
  • 您需要提供根元素信息。下面我用
    JAXBElement
    完成了这项工作
演示

import javax.xml.bind.*;
import javax.xml.namespace.QName;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(B1.class, B2.class);

        B1 b1 = new B1();
        JAXBElement<A> jaxbElement = new JAXBElement<A>(new QName("root"), A.class, b1);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(jaxbElement, System.out);
    }

}
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(C.class);

        C root = new C();
        root.getAs().add(new B1());
        root.getAs().add(new B2());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}
A

下面是如何利用
@xmlseea
注释引入子类

@XmlSeeAlso({ B1.class, B2.class })
public class A {
    private String m_name;
}
演示代码 下面是一些演示代码,展示了一切工作原理。请注意,现在我们使用
@xmlseea
我们使用
@xmlseea
引导
JAXBContext
时不需要包含子类

演示

import javax.xml.bind.*;
import javax.xml.namespace.QName;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(B1.class, B2.class);

        B1 b1 = new B1();
        JAXBElement<A> jaxbElement = new JAXBElement<A>(new QName("root"), A.class, b1);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(jaxbElement, System.out);
    }

}
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(C.class);

        C root = new C();
        root.getAs().add(new B1());
        root.getAs().add(new B2());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}
输出

下面是运行演示代码的输出

<?xml version="1.0" encoding="UTF-8"?>
<c>
    <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b1"/>
    <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b2"/>
</c>


上述类的jaxb注释在哪里?您还可以添加示例代码,说明如何封送/取消封送问题中提到的类吗?我已经尝试了大量不同的注释安排,我不想让人们对各种尝试感到厌烦。然而,如果你这么想,我可以举一个例子,这可能是一个非常愚蠢的问题,但我只是想知道,如果我有一个C类,它包含一个对象(或子类)的ArrayList,我将如何调整它?非常感谢你的努力!!明天早上我会试一试的!