Java XStream - 在根级别序列化/反序列化多种类型的数组

时间:2021-01-20 07:52:16

标签: java xstream

这两天我一直在 SO 和许多其他论坛上寻找我的场景,并在我的代码中尝试了几个想法,但似乎没有产生我所需的 xml,反序列化还有更多问题。

我的应用程序的用户必须将项目配置保存到 xml 文件中。现在该项目在根级别有 3 种不同的不同类型的对象,而不是一种。并且每个根有多个(但固定)数量的对象。每个根的每个对象内部还有其他类型的对象(这部分工作得很好)。所以层次结构是这样的:

public static AA a[] = new AA[Global.MAX1];
public static BB b[] = new BB[Global.MAX2];
public static CC c[] = new CC[Global.MAX3];

现在,随着我的应用程序的进行,用户创建并填充这些数组的所有对象,这些对象填充在 JTree 中。当他希望保存或在应用程序退出时,整个项目的配置(创建的对象)将保存到 .xml 文件中,以便稍后检索它们现在的状态,例如填充相同的 JTree。

@我尝试过的: 我看到的所有示例都只有一个顶级元素。由于我不想为每个项目创建 3 个不同的配置文件,所以我伪造了一个名为 Domain 的顶级元素,如下所示:

@XStreamAlias("Area")
public final class Domain {
    public static Domain domain = null;

    @XStreamAsAttribute
    public String name = "Area";

    @XStreamImplicit(itemFieldName = "aas")
    public static AA a[] = new AA[Global.MAX1];

    @XStreamImplicit(itemFieldName = "bbs")
    public static BB b[] = new BB[Global.MAX2];

    @XStreamImplicit(itemFieldName = "ccs")
    public static CC c[] = new CC[Global.MAX3];

    private Domain () { } // private so that it cannot be initialized by using {new domain();}

    public static Domain getInstance() { // singleton
        if (domain == null)
            domain = new Domain();
        return domain;
    }
}

但现在在项目节省时间,如果我使用以下代码进行序列化:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
xml += lnSep + xStream.toXML(Domain.getInstance()); // or define a domain object and use
xml += lnSep + xStream.toXML(Domain.a);             // that to pass data to toXML()
xml += lnSep + lnSep + xStream.toXML(Domain.b);     // with same final effect
xml += lnSep + lnSep + xStream.toXML(Domain.c);

然后我得到以下 xml(为简洁起见进行了修剪):

<?xml version="1.0" encoding="UTF-8"?>
<Area id="1" name="Area"/>
<aa-array id="1">
    <aa id="2">
    </aa>
</aa-array>

<bb-array id="1">
    <bb id="2">
    </bb>
</bb-array>

<cc-array id="1">
    <cc id="2">
    </cc>
</cc-array>

看看它如何在同一行结束域对象的 xml 而不是在 cc-array 之后关闭(根据我的要求)。而如果我只使用以下代码:

Domain domain = Domain.getInstance();
String xml2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
xml2 += lnSep + xStream.toXML(domain);

它(恼人地)只在 XML 文件中生成以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<Area id="1" name="Area"/>

似乎在 Domain 类中定义的数组根本没有被视为 Domain 包含的对象。

感谢您的耐心等待。有任何想法吗?我是否必须专门创建编组和解组方法?如果是的话……太麻烦了……请指导这种情况……一个具有一个字符串和 3 个数组对象的对象。

哦,顺便说一句,在这个序列化问题解决之后,反序列化问题就开始了;因为我的目标是取回 Domain 对象以完全填充我的 JTree。

一个附带问题:为什么 itemFieldName = "aas" 没有效果??

1 个答案:

答案 0 :(得分:0)

我的错...我制作了我的数组 static 以便可以从整个应用程序访问它们。而且 XStream 的文档/现场教程中没有提到静态成员不会被序列化/反序列化。

一时冲动,我使我的阵列非静态。在我访问这些数组的任何地方,整个应用程序中都发生了许多变化。我不得不使用 Domain.getInstance().ArrayName 来访问以前作为 Domain.ArrayName 访问的数组。在我删除了所有错误之后……哇……我两天前编写的相同 xstream 代码开始工作,没有任何更改。现在我的整个项目正在使用

序列化为 XML
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
xml += lnSep + xStream.toXML(domain);

并使用

反序列化
Domain domain = (Domain) xStream.fromXML(xml);

XStream 是 gr8!我写这个答案是为了让未来的用户受益。