【问题标题】:JAXB un/marshalling: Is there a difference between using arrays and lists?JAXB un/marshalling:使用数组和列表有区别吗?
【发布时间】:2015-01-06 21:45:04
【问题描述】:

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

我有兴趣了解的是 JAXB 在 un/marshalling 时如何处理这两种数据结构,以及是否最好将其标准化以使用另一种? 如果是这样,两者之间有什么区别(性能方面等)? 另外,在为我的物品选择容器时我应该考虑什么?

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

【问题讨论】:

    标签: java xml jaxb marshalling unmarshalling


    【解决方案1】:

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

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

    数组和Lists 各有利弊。使用对您的目的更好的东西。一般来说List 更容易使用,因为你有List.contains() 这样的实用方法,但Lists 不能用于原始类型。数组可以更快,但不太灵活。

    这完全取决于您使用哪种,哪种更适合您。

    【讨论】:

      【解决方案2】:

      需要考虑的几件事:

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

      【讨论】:

        【解决方案3】:

        用于编组或解组的 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>
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-10
          • 2015-08-11
          • 1970-01-01
          • 2022-06-20
          • 2012-12-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多