我陷入了XStream反序列化的困境。实际上,这是非常基本的,唯一棘手的事情是,我正在使用3级深度的内部类。也许我应该声明我正在使用注释。
以下是课程:
@XStreamAlias("content")
public class TranslationObject {
String lang;
@XStreamImplicit(itemFieldName = "unit")
List<ToTranslateTextObj> units;
public String getLang() {
return this.lang;
}
public void setLang(final String lang) {
this.lang = lang;
}
public List<ToTranslateTextObj> getUnits() {
if (this.units == null) {
this.units = new ArrayList<>();
}
return this.units;
}
public void setUnits(final List<ToTranslateTextObj> units) {
this.units = units;
}
public class ToTranslateTextObj {
@XStreamAsAttribute
String type;
@XStreamAsAttribute
String id;
@XStreamAsAttribute
Boolean versioning;
@XStreamAsAttribute
int version;
@XStreamImplicit(itemFieldName = "line")
List<Line> lines;
public String getType() {
return this.type;
}
public void setType(final String type) {
this.type = type;
}
public String getId() {
return this.id;
}
public void setId(final String id) {
this.id = id;
}
public Boolean getVersioning() {
return this.versioning;
}
public void setVersioning(final Boolean versioning) {
this.versioning = versioning;
}
public int getVersion() {
return this.version;
}
public void setVersion(final int version) {
this.version = version;
}
public List<Line> getLines() {
if (this.lines == null) {
this.lines = new ArrayList<>();
}
return this.lines;
}
public void setLines(final List<Line> lines) {
this.lines = lines;
}
public class Line {
@XStreamAsAttribute
int position;
@XStreamAsAttribute
int shifting;
String text;
public int getPosition() {
return this.position;
}
public void setPosition(final int position) {
this.position = position;
}
public int getShifting() {
return this.shifting;
}
public void setShifting(final int shifting) {
this.shifting = shifting;
}
public String getText() {
return this.text;
}
public void setText(final String text) {
this.text = text;
}
}
}
}
这是XStream调用:
final XStream xStream = new XStream();
xStream.setClassLoader(Thread.currentThread().getContextClassLoader());
xStream.ignoreUnknownElements();
xStream.processAnnotations(TranslationObject.class);
xStream.processAnnotations(ToTranslateTextObj.class);
xStream.processAnnotations(Line.class);
return (TranslationObject) xStream.fromXML(new File(path));
最后是使用相同类编组的xml:
<content>
<unit type="foo" id="id1" versioning="false" version="0">
<line position="1" shifting="0">
<text>bar1</text>
</line>
</unit>
<unit type="foo" id="id2" versioning="false" version="0">
<line position="1" shifting="0">
<text>bar2</text>
</line>
</unit>
<unit type="foo" id="id3" versioning="false" version="10000">
<line position="1" shifting="0">
<text>bar3</text>
</line>
</unit>
<unit type="foo" id="id4" versioning="false" version="10000">
<line position="1" shifting="0">
<text>bar4</text>
</line>
</unit>
</content>
任何有关失败原因的线索都会得到赞赏。
Stacktrace的内容如下:
com.thoughtworks.xstream.mapper.CannotResolveClassException: de.festo.webapp.translation.TranslationObject
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:81)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47)
at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1486)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1466)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1430)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1372)
at de.festo.webapp.serialization.ToTranslateSerializationImpl.unmarshal(ToTranslateSerializationImpl.java:70)
at de.festo.webapp.translation.dirwatch.TaskProcessor.processFolder(TaskProcessor.java:54)
at de.festo.webapp.translation.dirwatch.TaskProcessor.run(TaskProcessor.java:61)
at java.lang.Thread.run(Thread.java:745)
预先感谢