[英]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.