我最近开始研究包含一些JAXB可序列化/可反序列化类的代码。其中一个类中有一些列表,我想为它添加一个新列表。这些列表最初被声明为ArrayList。同样,get方法也返回了ArrayList。我将所有这些更改为List并添加了新列表以及List。但在那之后,我无法将此对象的xml解组为JAVA对象。当我将字段更改回ArrayList而没有任何其他更改时,解组工作正常。我还尝试将DefaultValidationEventHandler附加到Unmarshaller,但在解组时它不会吐出任何错误。下面是类和变量名称的类似变化
@XmlRootElement(name = "commandSet")
public class CommandSet {
private final ArrayList<Command> xCommands;
private final ArrayList<Command> yCommands;
@Override
@XmlElementWrapper(name = "xCommands")
@XmlElement(name = "xCommand", type = Command.class)
public ArrayList<Command> getXCommands() {
return this.xCommands;
}
@Override
@XmlElementWrapper(name = "yCommands")
@XmlElement(name = "yCommand", type = Command.class)
public ArrayList<Command> getYCommands() {
return this.yCommands;
}
}
当xCommands和yCommands声明为List并且getter也返回List时,unmarhsalling不起作用。
在我找到的用于解组列表的所有示例中,人们使用了List&lt;&gt;而不是ArrayList&lt;&gt;。任何想法为什么它不适用于List&lt;&gt;?
答案 0 :(得分:0)
我注意到您的代码有一些奇怪的事情可能会或可能不会影响您的问题。至少我怀疑你遇到问题的模型与你在问题中发布的模型不同。
get
注释了两个@Override
方法,但由于CommandSet
不会从任何内容(Object
除外)继承,因此您不是CommandSet
。覆盖任何事情。<强>命令集强>
在ArrayList
类的这个版本中,我创建了一个属性类型List
,另一个类型为import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class CommandSet {
private final ArrayList<Command> xCommands;
private final List<Command> yCommands;
public CommandSet() {
xCommands = new ArrayList<Command>();
yCommands = new ArrayList<Command>();
}
@XmlElementWrapper(name = "xCommands")
@XmlElement(name = "xCommand")
public ArrayList<Command> getXCommands() {
return this.xCommands;
}
@XmlElementWrapper(name = "yCommands")
@XmlElement(name = "yCommand")
public List<Command> getYCommands() {
return this.yCommands;
}
}
,以证明它们都有效。我还删除了上面提到的代码的奇怪之处。
public class Command {
}
<强>命令强>
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(CommandSet.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("input.xml");
CommandSet commandSet = (CommandSet) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(commandSet, System.out);
}
}
<强>演示强>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<commandSet>
<xCommands>
<xCommand/>
<xCommand/>
</xCommands>
<yCommands>
<yCommand/>
<yCommand/>
</yCommands>
</commandSet>
<强> input.xml中/输出强>
{{1}}