首页 > 解决方案 > 生成 xml 时出现 XStream OutOfMemoryError

问题描述

我定义了一个类来存储我的应用程序的配置数据。我想将此实例保存到 xml 并为此使用 XStream。但是当我尝试编写一个实例时,我总是遇到内存不足的错误。

这是我的类定义:

public class Eol_Target_Variable {
    String name;
    String alias;
    long value;
    long default_val;
    int size;
    int scaling;
    int div;
    Boolean read_access;
    Boolean write_access;


    public Eol_Target_Variable(String arg_name, String arg_alias, int arg_value, int arg_size, int arg_scaling,int arg_div)
    {
        name = arg_name;
        alias = arg_alias;
        value = arg_value;
        default_val = 0;
        scaling = arg_scaling;
        div = arg_div;
        size = arg_size;
        read_access = true;
        write_access = true;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }


    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

...等适用于所有标准的 getter 和 setter

这是我将单个对象导出到 xml 的处理程序

public void importConfiguration() {
    XStream xstream = new XStream(new DomDriver());
    Eol_Target_Variable myvar = new Eol_Target_Variable("jamie", "xtracold", 1977, 16, 1, 1);
    String myxml = xstream.toXML(myvar);
    System.out.print(myxml);
}

每次我得到“线程中的异常”JavaFX 应用程序线程“java.lang.OutOfMemoryError:Java 堆空间”抛出。我不明白为什么这么简单的类会抛出内存不足错误。我已经设法使用 XStream 输出简单的 String 对象,因此该库正在工作,只是这个自定义类似乎会导致问题。

我还尝试使用 VM 参数 -Xms512m -Xmx1024m 增加启动时分配的堆,但这没有区别。

谢谢杰米

标签: out-of-memoryxstream

解决方案


这是新的类声明

@XStreamAlias("targetVar")
public class Eol_Target_Variable {
    String name;
    String alias;
    long value;
    @XStreamAlias("default")
    long default_val;
    int size;
    int scaling;
    int div;
    @XStreamOmitField
    Node node;
    @XStreamOmitField
    Boolean read_access;
    @XStreamOmitField
    Boolean write_access;


public Eol_Target_Variable(String arg_name, String arg_alias, int arg_value, int arg_size, int arg_scaling,int arg_div,  Node arg_node)
{
    name = arg_name;
    alias = arg_alias;
    value = arg_value;
    default_val = 0;
    scaling = arg_scaling;
    div = arg_div;
    size = arg_size;
    node = arg_node;
    read_access = true;
    write_access = true;
}

我还使用了不同的解析器,因为基本的 DOMParser 从未处理过大量数据。当我更改为 StaxDriver 时,至少能够在调试输出中看到文本流,因为 XStream 遍历了整个场景图。

XStream xstream = new XStream(new StaxDriver());
xstream.processAnnotations(Eol_Target_Variable.class);

我不会假装完全理解为什么声明类 inlined 会导致问题,但我可以推断为什么要求 XStream 解析完整的 Node 可能会导致问题。

如果有人对在 JavaFX 应用程序中声明的 XStream 和复杂数据结构有任何经验,我会欢迎他们的意见。


推荐阅读