2009-09-03 103 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); 
    } 
}