我的团队最近继承了一个代码库,该代码库利用XStream 1.4.7为配置设置加载和保存XML,然后从/向自定义POCO取消/序列化它们。我们遇到的问题是某些值在读取或写入期间被破坏。它不是一直发生的,这使得它变得更加不寻常。在大多数情况下,它与完全相同的XML和完全相同的POCO完美配合。
一个非常简单的例子(我不能发布确切的代码,而且它要复杂得多,所以我想用一种简单的方法来解释我们所看到的内容)给出了XML:
<monitor>
<autostart>true</autostart>
<name>MYVALUE</name>
</monitor>
映射到POCO:
public class MonitorEntry {
public Boolean autostart;
public String name;
}
加载XStream:
XStream xStream = new XStream(new DomDriver());
xStream.alias("Monitor", MonitorEntry.class);
Monitor monitor = (Monitor)xStream.fromXML(myFile);
name
对象中Monitor
的值读作arVALUE
而不是MYVALUE
。一开始的垃圾字符就是抛出的东西。更奇怪的是,如果我们将<autostart>
元素的值更改为false
,那么XML将被正确映射并且垃圾字符不会出现。
为了增加这个谜团,我们最终只看到加载 XML到对象的损坏,但在一个特定的客户系统上,他们只有在实际保存<时才会看到损坏/ em>来自对象的XML。在这种情况下,它与上述情况完全相反。给定name
设置为MYVALUE
的相同POCO,写入XML文件的实际XML将变为:
<monitor>
<autostart>true</autostart>
<name>arVALUE</name>
</monitor>
现在对于一个字符串值,例如name
,这不是一个功能问题,因为它只是一个名称,然后拼写错误,但这成为一个问题是将XML值映射到,例如,enum
并且映射无法找到枚举值。
一个例子,如果有一个枚举:
public enum Type { VALUE1, VALUE2 };
POCO是:
public class MonitorEntry {
public Boolean autostart;
public String name;
public Type type;
}
使用XML:
<monitor>
<autostart>true</autostart>
<name>MYNAME</name>
<type>VALUE2</type>
</monitor>
但XStream正在将XML值读取为erLUE2
,然后XStream映射将无法匹配正确的枚举值并抛出异常,例如:
No enum const class com.sample.MonitorEntry$Type.erLUE2
我们尝试更新到XStream 1.4.8只是为了看看是否已修复某些内容但行为仍然存在。代码库设置为编译为Java 1.6但我们已经尝试了1.6,7和8作为运行时,只是为了查看它是运行时错误还是其他环境问题。
有没有其他人看到类似的问题或对可能导致此问题的任何建议?如有必要,我可以进一步更新我的帖子以包含更多细节。我们之前使用过XStream,但从未遇到过问题。
编辑:我们目前没有在此代码库中使用任何自定义转换器,只有内置的XStream转换器。