2012-04-09 15 views
5

Mam ziarna, które mają Obiekty, które mogą zawierać różne typy. Teraz, kiedy tworzę XML, doda atrybut klasy do serializowanego obiektu. Chciałbym zmienić na przykład klasową nazwę prostą.Serializacja klas XStream i Object

Przykład Java: inicjalizacji

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

Przykład XML:

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

chciałbym zmienić com.example.PossibleClass do PossibleClass lub coś innego. Czy to jest możliwe?

+0

Jedyną rzeczą, jaką mogę powiedzieć o jest to, że '' PossibleClass'' bez nazwy pakietu może powodować problemy z deserializacją, gdy wiele pakietów zawiera klasę o tej nazwie. W tym celu może być niemożliwe. –

Odpowiedz

6

Tak, możesz! Pomaga zmniejszyć rozmiar generowanego dokumentu. To dobra praktyka.
Użyj metody XStream.alias().

To działa dla mnie.

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

Bez alias

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

Z alias

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

nie jest poniżej podejście działa?

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

Szczegółowy samouczek. [link] (http://xstream.codehaus.org/alias-tutorial.html) – titogeo

+1

Już tego używam i nie ma efektów. – newbie

+0

Czy możesz skopiować swój kod? – titogeo

0

Tak, jeśli chcesz prostą nazwę klasy i wiesz pakiet obiektu można:

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

xml wyjściowa:

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

Proszę zignorować tę odpowiedź, stwierdziłem, że ten hack nie działa, ponieważ 1 pakiet z pustym aliasem powoduje problemy z deserializacją z klasami innych pakietów. – iberck