我们使用 XStream 序列化/反序列化 XML...并且刚刚得到 OutOfMemory
异常(exception)。
首先,我不明白为什么我们会收到错误,因为我们已分配给服务器 500MB。
问题是 - 我们应该做出哪些改变才能避免麻烦?我们希望确保此实现的规模。
目前我们有约 60K 对象,每个约 50 字节。我们将 60K POJO 加载到内存中,并将它们序列化为字符串,然后使用 HttpClient
将其发送到 Web 服务。 。接收时,我们得到整个String,然后转换为POJO。 XML/对象层次结构如下:
<root>
<meta>
<date>10/10/2009</date>
<type>abc</type>
</meta>
<data>
<field>x</field>
</data>
[thousands of <data>]
</root>
我认为最好的方法是不将 POJO 存储在内存中,并且不将内容写入单个字符串。相反,我们应该写个人 <data>
POJO 到流。 XStream supports这看起来像是 <meta>
元素将不受支持。数据需要采用以下形式:
<root>
<data>
<field>x</field>
</data>
[thousands of <data>]
</root>
那么什么方法最容易流式传输整个树?
最佳答案
您肯定希望避免将 POJO 序列化为巨大的字符串,然后将该字符串写出。使用 XStream API 将 POJO 直接序列化到您的 OutputStream。今年早些时候,我遇到了同样的情况,当时我发现生成 200-300Mb XML 文档并出现 OutOfMemoryErrors。切换非常容易。
阅读方面当然也是如此。不要将 XML 读入字符串并要求 XStream 从该字符串反序列化:直接从 InputStream 反序列化。
您提到了第二个问题,即无法序列化 <meta>
元素和 <data>
元素。我不认为这是 XStream 问题或限制,因为我通常按以下顺序序列化更复杂的结构:
<myobject>
<item>foo</item>
<anotheritem>foo</anotheritem>
<alist>
<alistitem>
<value1>v1</value1>
<value2>v2</value2>
<value3>v3</value3>
...
</alistitem>
...
<alistitem>
<value1>v1</value1>
<value2>v2</value2>
<value3>v3</value3>
...
</alistitem>
</alist>
<anotherlist>
<anotherlistitem>
<valA>A</valA>
<valB>B</valB>
<valC>C</valC>
...
</anotherlistitem>
...
</anotherlist>
</myobject>
我也成功地序列化和反序列化嵌套列表。
关于java - 使用 Java 序列化 XML 以进行流式传输的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1911773/