gpt4 book ai didi

java - JAXB 继承 - 非抽象基类

转载 作者:行者123 更新时间:2023-11-30 09:11:51 28 4
gpt4 key购买 nike

我目前正在尝试使用 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 的博客,包括 http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html 等文章。但他们似乎都没有帮助我的例子。我很可能误用了他的例子。在我看来,我的示例应该很容易在 JaxB 中得到支持 - 毕竟,Java 主要基于继承关系!

如果能得到快速回复,我将不胜感激!

最佳答案

您可以执行以下操作:

  • JAXB 将引入父类(super class),但不引入子类。您可以在叶类上创建 JAXBContext,也可以在父类上使用 @XmlSeeAlso 注释来拉入子类。
  • 您需要提供根元素信息。下面我使用 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);
}

}

输出

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

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

更新

hi, probably a really stupid question, but just wondering, how would I adapt this if I have a class C that holds an ArrayList of A objects (or subclasses)?

Java 模型

C

这是您评论中描述的 C 类:

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class C {

private List<A> as = new ArrayList<A>();

@XmlElement(name="a")
public List<A> getAs() {
return as;
}

}

一个

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

@XmlSeeAlso({ B1.class, B2.class })
public class A {
private String m_name;
}

演示代码

下面是一些演示代码来展示一切正常。请注意,现在我们使用 @XmlSeeAlso 我们使用 @XmlSeeAlso 我们不需要在引导 JAXBContext 时包含子类。

演示

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>

关于java - JAXB 继承 - 非抽象基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21913970/

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