问题描述
这两天我一直在 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 version="1.0" encoding="UTF-8"?>
<Area id="1" name="Area"/>
似乎在 Domain 类中定义的数组根本没有被视为 Domain 包含的对象。
感谢您的耐心等待。有任何想法吗?我是否必须专门创建编组和解组方法?如果是的话……太麻烦了……请指导这种情况……一个具有一个字符串和 3 个数组对象的对象。
哦,顺便说一句,在这个序列化问题解决之后,反序列化问题就开始了;因为我的目标是取回 Domain 对象以完全填充我的 JTree。
一个附带问题:为什么 itemFieldName = "aas"
没有效果??
解决方法
我的错...我制作了我的数组 static
以便可以从整个应用程序访问它们。而且 XStream 的文档/现场教程中没有提到静态成员不会被序列化/反序列化。
一时冲动,我使我的阵列非静态。在我访问这些数组的任何地方,整个应用程序中都发生了许多变化。我不得不使用 Domain.getInstance().ArrayName
来访问以前作为 Domain.ArrayName
访问的数组。在我删除了所有错误之后……哇……我两天前编写的相同 xstream 代码开始工作,没有任何更改。现在我的整个项目正在使用
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
xml += lnSep + xStream.toXML(domain);
并使用
反序列化Domain domain = (Domain) xStream.fromXML(xml);
XStream 是 gr8!我写这个答案是为了让未来的用户受益。