2012-04-09 15 views
5

Ich habe Bohnen, die Objekte haben, die verschiedene Arten enthalten können. Wenn ich jetzt XML erstelle, fügt es dem serialisierten Objekt ein Klassenattribut hinzu. Ich möchte das zum Beispiel Klassen einfachen Namen ändern.XStream und Objektklasse Serialisierung

Beispiel Java:

public class MyParentClass { 

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

// Getters & setters etc.. 

XStream Initialisierung:

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

Beispiel XML:

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

Ich möchte com.example.PossibleClass zu PossibleClass oder etwas anderes ändern. Ist das möglich?

+0

Das einzige, was ich sagen kann, über Es ist möglich, dass '' PossibleClass'' ohne Paketnamen Deserialisierungsprobleme verursachen kann, wenn mehrere Pakete eine Klasse dieses Namens enthalten. Dafür kann es unmöglich sein. –

Antwort

6

Ja können Sie! Es hilft, die Größe des generierten Dokuments zu reduzieren. Es ist eine gute Übung, dies zu tun.
Verwenden Sie XStream.alias() Methode.

Das funktioniert für mich.

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

Ohne alias

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

Mit Alias ​​

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

die folgenden Ansatz funktioniert nicht?

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

Ein ausführliches Tutorial. [link] (http://xstream.codehaus.org/alias-tutorial.html) – titogeo

+1

Ich benutze das bereits, und es hat keine Auswirkungen. – newbie

+0

Können Sie Ihren Code kopieren? – titogeo

0

Ja, wenn Sie den einfachen Namen der Klasse wollen, und Sie wissen das Paket des Objekts können Sie:

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

Ausgabe xml:

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

Bitte ignorieren Sie diese Antwort. Ich fand, dass dieser Hack nicht funktioniert, weil 1 Paket mit leerem Alias ​​Deserialisierungsprobleme mit Klassen anderer Pakete verursacht. – iberck