2012-04-09 19 views
5

Tengo frijoles que tienen objetos que pueden contener diferentes tipos. Ahora, cuando creo XML, agregará un atributo de clase a un objeto serializado. Me gustaría cambiar eso, por ejemplo, nombre simple de clase.serialización de clases de XStream y objetos

Ejemplo de Java:

public class MyParentClass { 

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

// Getters & setters etc.. 

xstream inicialización:

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

Ejemplo XML:

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

me gustaría cambiar a com.example.PossibleClass PossibleClass o alguna otra cosa. ¿Es eso posible?

+0

La única cosa que puedo decir sobre es que '' PossibleClass'' sin el nombre del paquete puede causar problemas de deserialización cuando varios paquetes contienen una clase de ese nombre. Por esto, puede ser imposible. –

Respuesta

6

¡Sí, puedes! Ayuda a reducir el tamaño del documento generado. Es una buena práctica hacerlo.
Utilice el método XStream.alias().

Esto funciona para mí.

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

Sin alias

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

Con alias

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

es el enfoque de abajo no funciona?

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

Un tutorial detallado. [link] (http://xstream.codehaus.org/alias-tutorial.html) – titogeo

+1

Ya lo uso, y no tiene efectos. – newbie

+0

¿Puedes copiar tu código? – titogeo

0

Sí, si desea que el simple nombre de la clase y sabes paquete del objeto se puede:

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

XML de salida:

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

Por favor, ignore esta respuesta, encontré que este truco no funciona porque 1 paquete con alias en blanco causa problemas de deserialización con clases de otros paquetes. – iberck

Cuestiones relacionadas