2009-09-03 52 views
4

我想为类短名称,现在我可以用别名XStream的短期动态别名

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

做,但我必须手动定义别名每一个类,有什么办法来配置XStream的做它会自动?

回答

3

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

+0

如果您有一种将类映射到别名的独特双向方式(例如,如果所有映射类都在相同的已知程序包中),那么这将非常有效。否则,这只会​​增加另一个间接级别,因为您仍然需要告诉映射器如何将别名映射到类。不过,我将这个应用于我的场景 - 对于OP的情况,这可能工作得很好。 – ChssPly76 2009-09-03 21:18:58

+2

我只需要将对象(不是我的)转换为xml,所以这可能会很好。 – IAdapter 2009-09-04 07:44:46

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)是不会帮助,除非你可以保证你将序列化之前的类反序列化它。 Plus(这可能会或可能不会成为您的担忧),您正在向对象引入显式的XStream依赖项。

我已经结束了标记我需要序列化的所有类(这里有几个选择:通过XStream或自己的注释对它们进行标注;让它们实现标记接口;从特定包中获取所有类),自动检测它们加载并显式配置XStream实例,将它们别名为不带包名的类名。

+1

很酷的想法,我甚至可以得到这对domian对象与正则表达式替换@Entity,但是这次不会为我工作,thx任何方式。 – IAdapter 2009-09-04 07:46:19

6

他们的方式我解决的问题是:

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); 
    } 
}