2012-04-09 4 views
5

私はさまざまな種類を含むことができるオブジェクトを持つ豆を持っています。 XMLを作成すると、クラス属性がシリアル化されたオブジェクトに追加されます。私はそれをクラスの単純な名前のように変更したいと思います。XStreamとオブジェクトクラスのシリアル化

例のJava:

public class MyParentClass { 

private Object childObjectAttribute; // Can be any instance of any interface ... 

// Getters & setters etc.. 

XStreamの初期化:

public XStream getXStream() 
{ 
    XStream xstream = new XStream(); 
    Class<?>[] c = { MyInterfaceImpl.class }; // MyInterfaceImpl has of course @XStreamAlias("MyInterface") 
    xstream.processAnnotations(c); 
    xstream.alias(MyInterface.class.getSimpleName(), MyInterface.class, MyInterfaceImpl.class); 
    return xstream; 
} 

例XML:

<myParentClass> 
    <childObjectAttribute class="com.example.PossibleClass"/> 
</myParentClass> 

私はPossibleClassまたは何か他のものにcom.example.PossibleClassを変更したいと思います。それは可能ですか?

+0

私が言うことができる唯一のことパッケージ名を持たない '' PossibleClass''は、複数のパッケージにその名前のクラスが含まれている場合に、直列化解除の問題を引き起こす可能性があります。これは不可能かもしれません。 –

答えて

6

はい、できます。生成されるドキュメントのサイズを縮小するのに役立ちます。これを行うのがよい習慣です。
XStream.alias()メソッドを使用してください。

これは私のために働く。別名

<MyPerson> 
    <firstName>Tito</firstName> 
    <lastName>George</lastName> 
</MyPerson> 

で別名

<co.in.test.PersonX> 
    <firstName>Tito</firstName> 
    <lastName>George</lastName> 
</co.in.test.PersonX> 

なし

PersonX person = new PersonX("Tito", "George"); 
XStream xstream = new XStream(); 
xstream.alias("MyPerson", PersonX.class); 
String str = xstream.toXML(person); 
System.out.println(str); 

は機能していない以下のアプローチですか?

workxstream.alias("PossibleClass", PossibleClass.class); 
+0

詳しいチュートリアル。 [link](http://xstream.codehaus.org/alias-tutorial.html) – titogeo

+1

私はすでにそれを使用しており、効果はありません。 – newbie

+0

コードをコピーできますか? – titogeo

0

はい、あなたはクラスの単純な名前をしたいとあなたはあなたができるオブジェクトのパッケージを知っている場合:

XStream xstream = new XStream(); 
xstream.aliasPackage("", "com.example"); 

を出力XML:

<myParentClass> 
    <childObjectAttribute class="PossibleClass"/> 
</myParentClass> 
+0

この回答は無視してください。空のエイリアスを持つ1つのパッケージが別のパッケージのクラスで直列化解除の問題を引き起こすため、このハックは機能しません。 – iberck

関連する問題