【问题标题】:Why does ArrayList implement Serializable?ArrayList为什么要实现Serializable?
【发布时间】:2013-05-01 00:04:18
【问题描述】:

我尝试使用 JAXB 序列化 ArrayList,但失败了。这是因为 elementData 被标记为瞬态吗?

为什么 ArrayList 实现了 Serializable Inferface 并且它的数据是瞬态的?

我尝试序列化一个可序列化的 ArrayList:

JAXBElement<ArrayList> jaxbElement = new JAXBElement<ArrayList>(new QName(ArrayList.class.getSimpleName()), ArrayList.class, allEntities);
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(jaxbElement, System.out);

如何通过 JAXB 做到这一点?

【问题讨论】:

  • 所以它可以用于跨网络连接或其他JVM发送(即通过RMI)
  • 您需要为ArrayList中对象的类实现Serializable。
  • ArrayList 中的对象确实实现了可序列化但使用 JAXB 我总是在 XML 输出中得到一个空的 ArrayList。
  • JAXB 序列化和 Java 内置的对象序列化是不同的概念。
  • 那么如何在 JAXB 中使用 List 呢?

标签: java serializable transient


【解决方案1】:

ArrayList 实现了 Serializable,所以它可以被序列化,这正是私有后备数组是瞬态的原因,所以它不会与类中的其他数据一起序列化,因为所有这些都由 ArrayList 的 writeObject 和 readObject 方法处理。

它这样做是因为它提供了自定义的 readObject 和 writeObject 方法,这些方法在序列化方面比默认方法做得更好。具体来说,writeObject 方法只写入元素的大小和序列。这避免了序列化私有数组对象,该对象 1) 具有自己的标头和开销,以及 2) 通常用空值填充。节省空间非常重要。

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 2010-09-15
    • 2018-07-29
    • 2012-06-17
    • 2011-01-27
    • 2011-06-23
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多