我想爲類短名稱,現在我可以用別名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