4

我想为类命名,现在我可以用别名来做

XStream x = new XStream();
x.alias("dic", Dic.class);

但是我必须为每个类手动定义别名,有没有办法配置 xstream 来自动完成?

4

3 回答 3

6

我解决的方法是:

1.- 当我创建 xstream 时,我覆盖了它的 wrapmapper 方法

XStream xstream = new XStream() {
    @Override
    protected MapperWrapper wrapMapper(MapperWrapper next) {
        return new MyClassAliasingMapper(next);
    }
};

2.- 与

public class MyClassAliasingMapper extends ClassAliasingMapper {

    public MyClassAliasingMapper(Mapper wrapped) {
        super(wrapped);
    }

    @Override
    public Class realClass(String elementName) {
        try {
            return <… your own class …&gt;
        } catch (Exception e) {
            // do nothing we fall back on super's implementation
        }
        return super.realClass(elementName);
    }

    @Override
    public String serializedClass(Class type) {
        try {
            return <… your own element name …&gt;
        } catch (Exception e) {
            // do nothing we fall back on super's implementation
        }
        return super.serializedClass(type);
    }
}
于 2010-11-10T22:41:54.157 回答
5

唯一的另一种选择是使用XStream 注释

package com.my.incredibly.long.package.name;

@XStreamAlias("dic")
public class Dic {
  ...

然后,在您配置 XStream 的代码中:

xstream.processAnnotations(Dic.class);
// OR
xstream.autodetectAnnotations(true);

然而,问题是为了反序列化你的类,XStream 必须已经知道它们的别名,所以autodetectAnnotations(true)除非你能保证在反序列化之前序列化类,否则它不会有帮助。另外(这可能对您来说是一个问题,也可能不是)您正在向您的对象引入一个显式的 XStream 依赖项。

我最终标记了我需要序列化的所有类(这里有几个选择:通过 XStream 或您自己的注释对它们进行注释;让它们实现标记接口;从特定包中获取所有类),在加载时自动检测它们并显式配置 XStream 实例以将它们别名为没有包名的类名。

于 2009-09-03T19:58:36.603 回答
3

在内部,XStream 使用它的Mapper接口来处理类和字段到它们在 XML 中的相应名称的映射。这个接口有大量的实现。XStream类本身可以Mapper在其构造函数中采用a。您可能想查看该类的源代码以查看它默认使用的 Mapper 实现,然后编写您自己的实现来自动为您执行别名。ClassAliasingMapper例如,看起来很有用。

于 2009-09-03T20:15:38.777 回答