在编组之前,JaxB是否将所有数据加载到内存中?

时间:2015-09-17 21:49:21

标签: java xml jaxb stax

我一直听说JAXB是一个速度较慢的XML marshaller / unmashaller。这是因为它一次将所有数据加载到内存中。 StaX已被建议作为替代方案,因为它是一个流API,它只将您当前正在处理的特定行加载到内存中。

我觉得JAXB在解组时只会慢一些,因为你需要提供一个XML文件进行解析。如果您正在编写XML,那么数据可能会在JAXB之外进入您的程序(假设它原本不是XML),因此JaxB无法控制将多少数据加载到内存中。

这是正确的假设吗?我试图更清楚地了解JAXB如何编组XML以及它与流API的差异。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

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

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

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

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

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