3

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

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

[致命错误]:1:1:序言中不允许内容。
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:字节大小:字节大小:字节大小:字节大小
----调试信息----
消息:字节大小:字节大小
原因异常:com.thoughtworks.xstream.mapper.CannotResolveClassException
原因消息:字节大小: ByteSize
类 : MyClass
所需类型 : MyClass
路径 : /MyClass/ByteSize
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
at 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。来自XML(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);
}
4

3 回答 3

4

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

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

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

于 2009-06-16T14:42:54.370 回答
4

这是一个编码问题。从 XStream文档

“所有 HierarchicalStreamDriver 实现都尊重 1.3 版以来的编码,但前提是您提供了 InputStream。”

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

Object obj = xStream.fromXML(new FileReader(xmlFile));
于 2012-04-02T16:04:28.927 回答
0

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

于 2009-06-16T14:44:59.157 回答