gpt4 book ai didi

java - JAXB 和继承在编码时起作用;但不解码

转载 作者:搜寻专家 更新时间:2023-11-01 03:23:52 25 4
gpt4 key购买 nike

我想编码/取消编码继承自另一个类的对象。

我从 Thing 类开始:

import java.util.List;

public class Thing {
private List<String> strings;

public List<String> getStrings() {
return strings;
}

public void setStrings(List<String> strings) {
this.strings = strings;
}
}

我扩展了这个类并用 JAXB 注释对其进行了注释。

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

@XmlRootElement
public class JaxbThing extends Thing {

// @XmlElementWrapper(name = "list")
@XmlElementWrapper(name = "strings")
@XmlElement(name = "string")
public List<String> getStrings() {
return super.getStrings();
}

public void setStrings(List<String> string) {
super.setStrings(string);
}
}

然后我运行以下编码/解码程序:

import java.io.File;
import java.util.Arrays;
import javax.xml.bind.*;

public class Main {
public static void main(String[] args) {
JaxbThing t = new JaxbThing();
t.setStrings(Arrays.asList("a", "b", "c"));
try {
File f = new File("jaxb-file.xml");

JAXBContext context = JAXBContext.newInstance(JaxbThing.class);

Marshaller m = context.createMarshaller();
m.marshal(t, f);

Unmarshaller um = context.createUnmarshaller();
JaxbThing t2 = (JaxbThing) um.unmarshal(f);

System.out.println(t2.getStrings()); // I expect to see [a, b, c]

} catch (JAXBException e) {
e.printStackTrace();
}
}
}

XML文件的内容是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxbThing>
<strings>
<string>a</string>
<string>b</string>
<string>c</string>
</strings>
</jaxbThing>

一切似乎都是正确的。但是解码的结果让我感到惊讶,因为控制台显示:

[
]

当我期望看到[a, b, c]

如果我以这种方式注释 strings 属性:

  @XmlElementWrapper(name = "list")
// @XmlElementWrapper(name = "strings")
@XmlElement(name = "string")
public List<String> getStrings() {
return super.getStrings();
}

然后控制台显示预期的[a, b, c]

我猜 JAXB 解码器正在使用类 Thing 而不是 JaxbThing 来解码 XML 文件内容。事实上,如果我用 @XmlTransient 注释类 Thing,我会得到预期的结果。

但是我不理解 JAXB 的这种行为。

谁能给我解释一下,好吗?提前谢谢你。

最佳答案

问题是您正在覆盖父类的属性。 JAXB 认为 JAXBThing 有“

  1. 名为 strings 的属性(继承自 String)映射到元素 strings
  2. 名为 strings 的属性(在 JAXBThing 上定义,映射到元素 strings 下的元素 string

如果您在 JAXBThingsetStrings 方法中放置一个断点,您将看到它首先使用正确的数据调用,然后第二次使用覆盖初始集的不正确数据(因为它认为它们是共享 setter 的不同属性)。

您始终可以通过使用 @XmlTransient 注释来删除 Thing 类。

import java.util.List;
import javax.xml.bind.annotation.XmlTransient;

@XmlTransient
public class Thing {
private List<String> strings;

public List<String> getStrings() {
return strings;
}

public void setStrings(List<String> strings) {
System.out.println("Thing" + strings);
this.strings = strings;
}

}

了解更多信息

关于java - JAXB 和继承在编码时起作用;但不解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20685703/

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