我想为类短名称,现在我可以用别名XStream的短期动态别名
XStream x = new XStream();
x.alias("dic", Dic.class);
做,但我必须手动定义别名每一个类,有什么办法来配置XStream的做它会自动?
我想为类短名称,现在我可以用别名XStream的短期动态别名
XStream x = new XStream();
x.alias("dic", Dic.class);
做,但我必须手动定义别名每一个类,有什么办法来配置XStream的做它会自动?
在内部,XStream使用它的Mapper
接口来处理类和字段到XML中相应名称的映射。这个接口有大量的实现。 XStream
类本身可以在其构造函数中使用Mapper
。您可能想要查看该类的源代码以查看默认情况下使用哪个Mapper实现,然后编写自己的实现,以便自动为您执行别名。例如,ClassAliasingMapper
看起来很有用。
唯一的其他选择是使用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)
是不会帮助,除非你可以保证你将序列化之前的类反序列化它。 Plus(这可能会或可能不会成为您的担忧),您正在向对象引入显式的XStream依赖项。
我已经结束了标记我需要序列化的所有类(这里有几个选择:通过XStream或自己的注释对它们进行标注;让它们实现标记接口;从特定包中获取所有类),自动检测它们加载并显式配置XStream实例,将它们别名为不带包名的类名。
很酷的想法,我甚至可以得到这对domian对象与正则表达式替换@Entity,但是这次不会为我工作,thx任何方式。 – IAdapter 2009-09-04 07:46:19
他们的方式我解决的问题是:
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);
}
}
如果您有一种将类映射到别名的独特双向方式(例如,如果所有映射类都在相同的已知程序包中),那么这将非常有效。否则,这只会增加另一个间接级别,因为您仍然需要告诉映射器如何将别名映射到类。不过,我将这个应用于我的场景 - 对于OP的情况,这可能工作得很好。 – ChssPly76 2009-09-03 21:18:58
我只需要将对象(不是我的)转换为xml,所以这可能会很好。 – IAdapter 2009-09-04 07:44:46