IAd*_*ter 4 java automation alias dynamic xstream
我希望有类的短名称,现在我可以用别名来做
XStream x = new XStream();
x.alias("dic", Dic.class);
Run Code Online (Sandbox Code Playgroud)
但我必须为每个类手动定义别名,有没有办法配置xstream自动执行?
我解决的方法是:
1.-当我创建xstream时,我覆盖它的wrapmapper方法
XStream xstream = new XStream() {
@Override
protected MapperWrapper wrapMapper(MapperWrapper next) {
return new MyClassAliasingMapper(next);
}
};
Run Code Online (Sandbox Code Playgroud)
2.-用
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);
}
}
Run Code Online (Sandbox Code Playgroud)
唯一的另一种选择是使用XStream注释:
package com.my.incredibly.long.package.name;
@XStreamAlias("dic")
public class Dic {
...
Run Code Online (Sandbox Code Playgroud)
然后,在您配置XStream的代码中:
xstream.processAnnotations(Dic.class);
// OR
xstream.autodetectAnnotations(true);
Run Code Online (Sandbox Code Playgroud)
但问题是,为了反序列化您的类,XStream必须已经知道它们的别名,所以autodetectAnnotations(true)除非您能保证在反序列化之前序列化该类,否则不会提供帮助.加上(这可能或可能不是您的担忧)您正在向对象引入显式的XStream依赖项.
我最终标记了我需要序列化的所有类(这里有几个选择:通过XStream或您自己的注释注释它们;让它们实现标记接口;从特定包中获取所有类),在加载时自动检测它们并明确地配置XStream实例将它们别名为没有包名称的类名.
| 归档时间: |
|
| 查看次数: |
4026 次 |
| 最近记录: |