2009-09-03 21 views
4

私は別名XStreamの短いダイナミック別名

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

でそれを行うことができますが、私はすべてのクラスのために手動で別名を定義する必要があり、今、やってXStreamのを設定するには、どのような方法があり、クラスのための短い名前を持つようにしたいですそれは自動的に?

答えて

3

内部的には、XStreamはクラスとフィールドの対応するXMLへのマッピングを処理するために、そのMapperインターフェイスを使用します。このインタフェースには多数の実装があります。 XStreamクラス自体は、コンストラクタでMapperを取ることができます。そのクラスのソースコードをチェックして、デフォルトで使用するMapper実装を確認し、エイリアシングを自動的に行う独自の実装を記述することができます。たとえば、ClassAliasingMapperが便利です。彼らは道私が解決

+0

クラスをエイリアスにマッピングするためのユニークな双方向性の方法(たとえば、すべてのマップされたクラスが同じ既知のパッケージに含まれている場合)があれば、これはうまくいくでしょう。さもなければ、あなたのマッパーにエイリアスをクラスにマップする方法を伝える必要があるので、これは間接の別のレベルを追加するだけです。私はこれを私のシナリオに適用していますが、これはOPの状況でうまくいくかもしれません。 – ChssPly76

+2

私はオブジェクト(私ではない)をXMLに変換する必要があるので、これはうまくいくかもしれません。 – IAdapter

5

唯一の他の選択肢はXStream annotations使用することです:

xstream.processAnnotations(Dic.class); 
// OR 
xstream.autodetectAnnotations(true); 

問題は、しかし、順番に自分のクラスをデシリアライズすることです:あなたはXStreamのを設定し、あなたのコード内で、次に

package com.my.incredibly.long.package.name; 

@XStreamAlias("dic") 
public class Dic { 
    ... 

をXStreamは、autodetectAnnotations(true)は、デシリアライズする前にクラスをシリアル化することを保証できない限り、autodetectAnnotations(true)はのエイリアスを既に知っているので、に助けになりません。プラス(これはあなたにとっては心配かもしれません)、あなたのオブジェクトに明示的なXStream依存性を導入しています。

シリアライズする必要があるすべてのクラスにタグを付けました(XStreamや独自の注釈で注釈を付けたり、マーカーインターフェイスを実装したり、特定のパッケージからすべてのクラスを取得したり、 XStreamインスタンスを明示的にコンフィグレーションして、パッケージ名なしでそれらをクラス名としてエイリアスすることができます。

+1

クールなアイディアで

XStream xstream = new XStream() { @Override protected MapperWrapper wrapMapper(MapperWrapper next) { return new MyClassAliasingMapper(next); } }; 

2.-そのwrapmapperメソッドをオーバーライドするXStreamの作成すると、私も得ることができますこれは@Entityの正規表現に置き換えられたdomianオブジェクトですが、これは今のところ私のためにはうまくいきません。 – IAdapter

6

は次のとおりです。

1.-私は

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