【问题标题】:Does JaxB Load Entire All data into into Memory before marshalling?JaxB 是否在编组之前将整个所有数据加载到内存中?
【发布时间】:2015-09-17 21:49:20
【问题描述】:

我一直听说 JAXB 是一个较慢的 XML 编组器/解组器。这是因为它一次将所有数据加载到内存中。有人建议使用 StaX 作为替代方案,因为它是一种流式 API,只会将您当前正在处理的特定行加载到内存中。

在我看来,JAXB 只会在解组时变慢,因为您向它提供了一个要解析的 XML 文件。就好像您正在编组 XML 一样,数据可能会在 JAXB 之外进入您的程序(假设它最初不是 XML),因此 JaxB 无法控制将多少数据加载到内存中。

这是一个正确的假设吗?我试图更清楚地了解 JAXB 如何编组 XML,以及它与流式 API 相比有何不同。

【问题讨论】:

  • 你的问题没有意义。 JAXB 编组已经在内存中、由应用程序创建并传递给 JSXB 进行编组的对象。在编组过程中它本身不会加载任何内容。它在 unmarshalling 期间创建对象。

标签: java xml jaxb stax


【解决方案1】:

Jaxb 需要将所有数据保存在内存中以解析引用。

当对象 B 引用了对象 A 时,对象 B 的 XML 记录中存储的是对象 A 的 id。因此,在保存对象 B 时必须知道对象 A 的 id。由于 JAXB 无法预见哪些对象被哪些对象引用,因此需要在保存时将它们全部保存在内存中。

加载时也是如此:当 JAXB 加载对象 B 的 XML 记录时,它会在其中找到对象 A 的 id。因此,它需要能够通过 id 找到对象 A(在地图中由 JAXB 内部维护),以便它可以在新创建的对象 B 中存储对对象 A 的引用。

所以,是的,JAXB 需要将所有内容都保存在内存中。

我不知道 JAXB 是否足够聪明,可以检测到没有对象相互引用以跳过所有这些东西的情况。但是,如果您没有相互引用的对象,那么您可能不需要像 JAXB 这样复杂的东西。

【讨论】:

    【解决方案2】:

    JAXB 不会在 解组之前加载所有数据,但由于它应该为所有 XML 元素和属性创建 Java 对象/值,它最终会在 期间加载所有数据 解组。

    否则您的对象模型将不完整。

    流式 API 非常适合读取大型 XML 文件,前提是不需要同时需要所有信息。如果您可以在继续之前处理第一部分,则无需保留该数据,并且可以将其释放,从而允许重用内存。


    编组也是如此。 JAXB 要求在编组之前 将整个对象模型构建在内存中。 “加载”数据的不是 JAXB,它只是消耗它。

    流式 API 也适用于编写大型 XML 文件,因为它可以增量构建。

    【讨论】:

    • 你在描述 un-marshalling。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2012-11-17
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多