java - 使用 Java 序列化 XML 以进行流式传输的最佳方法?

标签 java xml web-services stream xstream

我们使用 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/

相关文章:

web-services - 如何使用 Restify 增加服务器端的套接字超时?

ios - 如何在 iOS 应用程序中使用带标志的 REST API?

java - 执行过程中如何查看sikuli日志?

java - 如何将麦克风音频流式传输到同一设备 throw 扬声器

java - 在 eclipse 中查看 java 项目的 Logger 输出

xslt中的java函数getTime

java - 如何使用java向json添加数据?

c - 使用 MiniXML 在 C 中解析 XML 文件

java - Commons XMLConfiguration 和模式验证?

javascript - 远程javascript html代码注入(inject)