【问题标题】:How do I keep java XMLEconder from using so much memory when writing a List?java - 编写List时如何防止java XMLEconder使用这么多内存?
【发布时间】:2013-11-16 22:18:22
【问题描述】:

我在 ArrayList (boList) 中有可序列化的关系 javabean BO,我想使用 XMLEncoder 或其他一些标准方法将其写入 XML。

使用:

XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
   new FileOutputStream("C:/tmp/test.xml")));

encoder.writeObject(boList);
encoder.close();

我的内存用完了。但是,如果我这样做:

for(BO bo : boList)
{
    encoder.writeObject(bo);
    encoder.flush();
}
encoder.close();

它使用很少的内存即可完美运行。我知道 flush() 将生成的 xml 写入文件并释放引用的内存,这是有意义的。我怀疑在编写 boList XMLEncoder 时,它会尝试在写入之前生成所有 XML,但内存不足。

我需要能够将 boList 写入 XML,因为它将是父 BO 中的一个字段,它将被写入 XML。在我对每个单独的对象调用“writeObject”的情况下,如何让它与列表一起运行?是否有替代 XMLEncoder 的方法可以实现这一点,并且使用起来非常简单?这必须使用没有第三方库的标准 JRE/Java 6 功能来完成。谢谢!

【问题讨论】:

    标签: java xml xml-serialization javabeans


    【解决方案1】:

    经过大量研究和阅读 XMLEncoder 的实现代码后,我确定它确实在为每次调用 writeObject(...) 编写输出之前在内存中构建了所有 xml 结构。使用 XMLEncoder 似乎没有可行的方法。

    我决定使用替代的第三方开源库。在这种情况下,XStream (http://x-stream.github.io/) 提供与 XMLEncoder 完全相同的最终功能,但更加健壮。它将生成的 xml 流式传输到目标,因为它正在生成,从而大大减少了内存占用。

    简而言之,我的回答是,如果不实际更改 XMLEncoder 的实现,就无法减少 XMLEncoder 的内存占用对于大型对象图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多