XStream在加载和保存时破坏值

时间:2015-06-03 21:45:22

标签: java xml xstream

我的团队最近继承了一个代码库,该代码库利用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转换器。

0 个答案:

没有答案