gpt4 book ai didi

java - 使用 jaxb 编码时使用派生类

转载 作者:搜寻专家 更新时间:2023-10-31 20:15:32 24 4
gpt4 key购买 nike

我有一个具有公共(public)基类的对象列表,我正在尝试使用 jaxb 将其序列化为 XML。我希望在编码时使用派生类的注释,但我无法做到这一点。

import java.util.Arrays;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;


public class Runner {
@XmlRootElement(name="base")
public static abstract class Base {
public int baseValue;

public Base() {
this.baseValue = 0;
}
}

@XmlRootElement(name="derived")
public static class Derived extends Base {
public int derivedValue;

public Derived() {
super();
this.derivedValue = 1;
}
}

@XmlRootElement(name="derived2")
public static class Derived2 extends Base {
public int derivedValue;

public Derived() {
super();
this.derivedValue = 1;
}
}

@XmlRootElement(name="base_list")
public static class BaseList {
public List<Base> baseList;
}

public static void main(String[] args) throws JAXBException {
BaseList baseList = new BaseList();
baseList.baseList = Arrays.asList((Base) new Derived(), (Base) new Derived());

JAXBContext jaxbContext = JAXBContext.newInstance(BaseList.class);

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.marshal(baseList, System.out);

}
}

我愿意:

<base_list>
<derived>
<baseValue>0</baseValue>
<derivedValue>1</derivedValue>
</derived>
<derived2>
<baseValue>0</baseValue>
<derivedValue>1</derivedValue>
</derived2>
</base_list>

但是,上面的代码给出了:

<base_list>
<baseList>
<baseValue>0</baseValue>
</baseList>
<baseList>
<baseValue>0</baseValue>
</baseList>
</base_list>

有没有办法强制它使用派生类?在实际情况下,我无法提前知道可能派生自 Base 的类。

请注意,我只需要编码数据,而不需要解码数据。

最佳答案

您可以使用 @XmlElementRef 注释来处理这个用例。 @XmlElementRef 对应于 XML 模式中的替换组概念。

举个例子:

关于java - 使用 jaxb 编码时使用派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6469599/

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