XStream短动态别名

时间:2009-09-03 09:48:55

标签: java dynamic automation alias xstream

我希望有类的短名称,现在我可以使用别名

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

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

3 个答案:

答案 0 :(得分:6)

我解决的方法是:

1.-当我创建xstream时,我覆盖其wrapmapper方法

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

2.- with

public class MyClassAliasingMapper extends ClassAliasingMapper {

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

    @Override
    public Class realClass(String elementName) {
        try {
            return <… your own class …>
        } 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 …>
        } catch (Exception e) {
            // do nothing we fall back on super's implementation
        }
        return super.serializedClass(type);
    }
}

答案 1 :(得分:5)

唯一的另一种选择是使用XStream annotations

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实例,将它们作为没有包名的类名别名。

答案 2 :(得分:3)

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