JAXB un/marshalling:使用数组和列表有区别吗?
JAXB un/marshalling: Is there a difference between using arrays and lists?
我对 JAXB 还很陌生,很想了解它的更多信息。
我注意到的是,在编组时,数组和列表中对象的 XML 表示是相同的。
我感兴趣的是 JAXB 在 un/marshalling 时如何处理这两种数据结构,以及是否最好将其标准化以使用其中一种?
如果是这样,两者之间有什么区别(性能方面等)?
另外,在为我的物品选择容器时我应该考虑什么?
如有任何信息,我们将不胜感激。谢谢!
在 XML 表示中,数组和 List
具有相同的形式。解组 XML 时,JAXB 将选择您在 Java class.
中的类型
可以将集合解组为从 List
编组的数组,反之亦然。
数组和List
s 都各有利弊。使用对您的目的更好的东西。一般来说 List
更容易使用,因为你有像 List.contains()
这样的实用方法,但是 List
s 不能用于原始类型。数组可以更快但不够灵活。
这完全取决于您使用哪种,哪种更适合您。
对于编组或解组,列表或数组之间没有区别。它可以在两种意义上工作,当你编组一个 array/List 时,你可以解组一个 List/array.
有一个简单的例子:
@XmlRootElement(name = "ROOT")
@XmlAccessorType(XmlAccessType.FIELD)
public class JAXBExample {
@XmlElement(name = "list")
private List<Elm> list;
@XmlElement(name = "array")
private Elm[] array;
public JAXBExample() {
this.list = new ArrayList<>();
this.array = new Elm[0];
}
public void addList(Elm elm) {
this.list.add(elm);
}
public void addArray(Elm elm) {
Elm[] tmp = new Elm[array.length+1];
System.arraycopy(array, 0, tmp, 0, array.length);
tmp[array.length] = elm;
this.array = tmp;
}
private void clear() {
this.array = null;
this.list.clear();
}
@XmlRootElement(name = "element")
@XmlAccessorType(XmlAccessType.FIELD)
static class Elm {
@XmlElement(name = "name")
private final String name;
public Elm() {
this.name = "noname";
}
public Elm(String name) {
this.name = name;
}
}
public static void main(String... arg) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(JAXBExample.class,
Elm.class);
Marshaller marshaller = context.createMarshaller();
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBExample jaxb = new JAXBExample();
jaxb.addArray(new Elm("Elm1"));
jaxb.addArray(new Elm("Elm3"));
jaxb.addArray(new Elm("Elm5"));
jaxb.addArray(new Elm("Elm7"));
jaxb.addArray(new Elm("Elm9"));
jaxb.addList(new Elm("Elm2"));
jaxb.addList(new Elm("Elm4"));
jaxb.addList(new Elm("Elm6"));
jaxb.addList(new Elm("Elm8"));
jaxb.addList(new Elm("Elm10"));
File f = new File("example.xml");
marshaller.marshal(jaxb, f);
jaxb.clear();
jaxb = null;
jaxb = (JAXBExample) unmarshaller.unmarshal(f);
for (Elm elm : jaxb.array) {
System.out.println("ArrayElm: " + elm.name);
}
for (Elm elm : jaxb.list) {
System.out.println("ListElm: " + elm.name);
}
}
}
产生:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ROOT>
<list>
<name>Elm2</name>
</list>
<list>
<name>Elm4</name>
</list>
<list>
<name>Elm6</name>
</list>
<list>
<name>Elm8</name>
</list>
<list>
<name>Elm10</name>
</list>
<array>
<name>Elm1</name>
</array>
<array>
<name>Elm3</name>
</array>
<array>
<name>Elm5</name>
</array>
<array>
<name>Elm7</name>
</array>
<array>
<name>Elm9</name>
</array>
</ROOT>
可以看到,数组和列表的存储格式是一样的
需要考虑的几件事:
- JAXB 实现可能会使用 SAX 或 StAX 解析器来处理 XML。由于它无法轻易知道 XML 中最终会出现多少项,因此很可能会先将它们放入
List
中,然后再将其转换为数组。
- JAXB impls 支持多维数组但不支持多维列表。
我对 JAXB 还很陌生,很想了解它的更多信息。 我注意到的是,在编组时,数组和列表中对象的 XML 表示是相同的。
我感兴趣的是 JAXB 在 un/marshalling 时如何处理这两种数据结构,以及是否最好将其标准化以使用其中一种? 如果是这样,两者之间有什么区别(性能方面等)? 另外,在为我的物品选择容器时我应该考虑什么?
如有任何信息,我们将不胜感激。谢谢!
在 XML 表示中,数组和 List
具有相同的形式。解组 XML 时,JAXB 将选择您在 Java class.
可以将集合解组为从 List
编组的数组,反之亦然。
数组和List
s 都各有利弊。使用对您的目的更好的东西。一般来说 List
更容易使用,因为你有像 List.contains()
这样的实用方法,但是 List
s 不能用于原始类型。数组可以更快但不够灵活。
这完全取决于您使用哪种,哪种更适合您。
对于编组或解组,列表或数组之间没有区别。它可以在两种意义上工作,当你编组一个 array/List 时,你可以解组一个 List/array.
有一个简单的例子:
@XmlRootElement(name = "ROOT")
@XmlAccessorType(XmlAccessType.FIELD)
public class JAXBExample {
@XmlElement(name = "list")
private List<Elm> list;
@XmlElement(name = "array")
private Elm[] array;
public JAXBExample() {
this.list = new ArrayList<>();
this.array = new Elm[0];
}
public void addList(Elm elm) {
this.list.add(elm);
}
public void addArray(Elm elm) {
Elm[] tmp = new Elm[array.length+1];
System.arraycopy(array, 0, tmp, 0, array.length);
tmp[array.length] = elm;
this.array = tmp;
}
private void clear() {
this.array = null;
this.list.clear();
}
@XmlRootElement(name = "element")
@XmlAccessorType(XmlAccessType.FIELD)
static class Elm {
@XmlElement(name = "name")
private final String name;
public Elm() {
this.name = "noname";
}
public Elm(String name) {
this.name = name;
}
}
public static void main(String... arg) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(JAXBExample.class,
Elm.class);
Marshaller marshaller = context.createMarshaller();
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBExample jaxb = new JAXBExample();
jaxb.addArray(new Elm("Elm1"));
jaxb.addArray(new Elm("Elm3"));
jaxb.addArray(new Elm("Elm5"));
jaxb.addArray(new Elm("Elm7"));
jaxb.addArray(new Elm("Elm9"));
jaxb.addList(new Elm("Elm2"));
jaxb.addList(new Elm("Elm4"));
jaxb.addList(new Elm("Elm6"));
jaxb.addList(new Elm("Elm8"));
jaxb.addList(new Elm("Elm10"));
File f = new File("example.xml");
marshaller.marshal(jaxb, f);
jaxb.clear();
jaxb = null;
jaxb = (JAXBExample) unmarshaller.unmarshal(f);
for (Elm elm : jaxb.array) {
System.out.println("ArrayElm: " + elm.name);
}
for (Elm elm : jaxb.list) {
System.out.println("ListElm: " + elm.name);
}
}
}
产生:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ROOT>
<list>
<name>Elm2</name>
</list>
<list>
<name>Elm4</name>
</list>
<list>
<name>Elm6</name>
</list>
<list>
<name>Elm8</name>
</list>
<list>
<name>Elm10</name>
</list>
<array>
<name>Elm1</name>
</array>
<array>
<name>Elm3</name>
</array>
<array>
<name>Elm5</name>
</array>
<array>
<name>Elm7</name>
</array>
<array>
<name>Elm9</name>
</array>
</ROOT>
可以看到,数组和列表的存储格式是一样的
需要考虑的几件事:
- JAXB 实现可能会使用 SAX 或 StAX 解析器来处理 XML。由于它无法轻易知道 XML 中最终会出现多少项,因此很可能会先将它们放入
List
中,然后再将其转换为数组。 - JAXB impls 支持多维数组但不支持多维列表。