XStream fromXML()异常

时间:2009-06-16 14:36:20

标签: java exception xml-serialization xstream

我正在尝试使用XStream包在Java中反序列化字符串。 XStream包可以很好地序列化我的类。我从服务器获取XML(不能更改XML的格式)并尝试将其节点信息保存到某个类中的相应变量。我的函数位于底部,我试图为XStream对象注册一个新的转换器(认为这是因为一个变量是一个字节数组),但仍然没有运气。谁能解释这些例外?我是否需要注册“MyClass”并为XStream编写自己的转换器来处理反序列化我的类?提前谢谢。

如果将字符串或StringReader对象作为输入传递给fromXML(),则异常:

  

[致命错误]:1:1:prolog中不允许内容   com.thoughtworks.xstream.io.StreamException :: prolog中不允许使用内容       在com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:86)
      在com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:66)
      在com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)

如果将ByteArrayInputStream用作fromXML()的输入,则异常:

  

com.thoughtworks.xstream.converters.ConversionException:ByteSize:ByteSize:ByteSize:ByteSize
  ----调试信息----
  消息:ByteSize:ByteSize
  cause-exception:com.thoughtworks.xstream.mapper.CannotResolveClassException
  cause-message:ByteSize:ByteSize
  class:MyClass
  required-type:MyClass
  路径:/ MyClass / ByteSize
      在com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
      在com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
      在com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
      在com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
      在com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
      在com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
      在com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
      在com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
      在com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)

static Object fromXmlString(String xml) 
{
    XStream xStream = new XStream(new DomDriver());
    xStream.registerConverter(new EncodedByteArrayConverter());
    //tried all 3 below
    //return xStream.fromXML(new StringReader(xml));
    //return xStream.fromXML(new ByteArrayInputStream(xml.getBytes()));
    return xStream.fromXML(xml);
}

3 个答案:

答案 0 :(得分:4)

看一下这个问题:content not allowed in prolog exception

“prolog中不允许的内容”通常表示文件中<?xml标题(“prolog”)之前有一些内容。这是不允许的。

因此,请检查以确保字符串中的<?xml之前没有字符,并且您没有任何BOM问题。

答案 1 :(得分:4)

这是编码问题。 来自XStream documentation

  

“所有HierarchicalStreamDriver实现都遵循自1.3版以来的编码,但仅限于您提供InputStream。”

当您尝试阅读XML时,只需添加一个Reader。例如:

Object obj = xStream.fromXML(new FileReader(xmlFile));

答案 2 :(得分:0)

您的反序列化/解码XStream实例是否以与编码XStream实例相同的相同方式配置?我会检查后者,并确保相同的XStream实例都可以编码/解码。