【发布时间】:2010-11-25 05:46:30
【问题描述】:
我想为类设置短名称,现在我可以使用别名来实现
XStream x = new XStream();
x.alias("dic", Dic.class);
但是我必须为每个类手动定义别名,有没有办法将 xstream 配置为自动完成?
【问题讨论】:
标签: java dynamic automation alias xstream
我想为类设置短名称,现在我可以使用别名来实现
XStream x = new XStream();
x.alias("dic", Dic.class);
但是我必须为每个类手动定义别名,有没有办法将 xstream 配置为自动完成?
【问题讨论】:
标签: java dynamic automation alias xstream
我解决的方法是:
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 …>
} 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);
}
}
【讨论】:
唯一的其他选择是使用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 实例以将它们别名为没有包名的类名。
【讨论】:
在内部,XStream 使用其Mapper 接口来处理将类和字段映射到它们在 XML 中的相应名称。这个接口有大量的实现。 XStream 类本身可以在其构造函数中使用 Mapper。您可能想查看该类的源代码以查看它默认使用的 Mapper 实现,然后编写您自己的实现来自动为您执行别名。例如,ClassAliasingMapper 看起来很有用。
【讨论】: