我想编组/解组继承另一个类的类的对象.
我从课程开始:
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 unmarshaler正在使用类Thing而不是JaxbThing来解组XML文件内容.事实上,如果我使用@XmlTransient注释类Thing,我会得到预期的结果.
但是我不明白JAXB的这种行为.
有人可以解释一下吗,拜托?先感谢您.
最佳答案 问题是您要从父类重写属性. JAXB认为JAXBThing有“
>一个名为strings(继承自String)的属性,映射到元素字符串.
>一个名为strings的属性(在JAXBThing上定义,映射到元素字符串下的元素字符串).
如果在JAXBThing的setStrings方法中设置断点,您将看到它首先使用正确的数据调用,然后第二次使用不正确的数据来覆盖初始集(因为它认为它们是共享的不同属性一个二传手.
您始终可以通过使用@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;
}
}
欲获得更多信息
> http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html