クラスに短い名前を付けたいのですが、エイリアスを使用できるようになりました
XStream x = new XStream();
x.alias("dic", Dic.class);
しかし、すべてのクラスに対してエイリアスを手動で定義する必要があります。自動的に行うように xstream を構成する方法はありますか?
クラスに短い名前を付けたいのですが、エイリアスを使用できるようになりました
XStream x = new XStream();
x.alias("dic", Dic.class);
しかし、すべてのクラスに対してエイリアスを手動で定義する必要があります。自動的に行うように xstream を構成する方法はありますか?
私が解決した方法は次のとおりです。
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 インスタンスを構成して、パッケージ名のないクラス名としてエイリアスを設定します。
内部的には、XStream はそのMapper
インターフェースを使用して、クラスとフィールドを XML 内の対応する名前にマッピングします。このインターフェースには多数の実装があります。XStream
クラス自体は、そのコンストラクターで a を取ることができますMapper
。そのクラスのソース コードを調べて、デフォルトでどの Mapper 実装を使用するかを確認し、自動的にエイリアシングを行う独自の実装を作成することをお勧めします。ClassAliasingMapper
たとえば、便利に見えます。