繁体   English   中英

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

[英]Java XStream - Serialize/deserialize multiple types of arrays at root level

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

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

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

现在随着我的应用程序的继续,用户创建并填充这些 arrays 的所有对象,这些对象填充在 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"/>

似乎在域 class 中定义的 arrays 根本没有被视为域的包含对象。

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

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

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

我的错......我制作了我的 arrays static以便可以从整个应用程序访问它们。 XStream 的文档/现场教程中没有提到 static 成员未序列化/反序列化。

一时冲动,我把我的 arrays 做成了非静态的。 无论我在哪里访问这些 arrays,整个应用程序都发生了许多变化。 我必须使用Domain.getInstance().ArrayName来访问以前作为Domain.ArrayName访问的数组。 在我删除了所有错误之后......哇......我在 2 天前编写的相同 xstream 代码开始工作,没有任何改变。 现在我的整个项目正在序列化为 XML 使用

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

并使用反序列化

Domain domain = (Domain) xStream.fromXML(xml);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM