首页 > 解决方案 > XStream 不会使用具有 CannotResolveClassException 的相同类解组由 XStream 编组的文件

问题描述

我被困在一些 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)

提前致谢

标签: javaannotationsinner-classesxstream

解决方案


推荐阅读