JAXB un / marshalling:使用数组和列表有区别吗?

时间:2015-01-06 21:45:04

标签: java xml jaxb marshalling unmarshalling

我对JAXB相当陌生,并且渴望了解更多信息。 我注意到的是,当编组时,数组和列表中对象的XML表示是相同的。

我有兴趣了解JAXB如何在联合编组时处理这两种数据结构,如果将其标准化以使用其他数据结构更好? 如果是这样,两者之间有什么区别(性能方面等)? 另外,在为对象选择容器时应该考虑什么?

任何信息将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:2)

在XML表示中,数组和List具有相同的形式。在解组XML时,JAXB将选择Java类中的类型。

可以将集合解组为从List编组的数组,反之亦然。

数组和List都有其优缺点。使用更适合您的目的。通常List更容易使用,因为您有List.contains()等实用程序方法,但List s不能用于基本类型。数组可以更快但灵活性更低。

这取决于你使用哪种,哪种更适合你。

答案 1 :(得分:2)

要考虑的几件事情:

  1. JAXB实现可能会使用SAX或StAX解析器来处理XML。由于无法轻易知道XML中最终会出现多少项,因此最好先将它们放在List中,然后将其转换为数组。
  2. JAXB impls支持多维数组,但不支持多维列表。

答案 2 :(得分:0)

用于编组或解组的List或数组之间没有区别。它可以在两种方式下工作,当你编组数组/ List时,你可以解组List /数组。

有一个简单的例子:

@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>

如您所见,数组和列表具有相同的存储格式。