XStream短动态别名

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

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

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

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

我解决的方法是:

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注释 :

 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实例将它们作为类名别名,而不包含包名。