2012-04-09 2 views
5

У меня есть beans, у которых есть объекты, которые могут содержать разные типы. Теперь, когда я создаю XML, он добавит атрибут класса к сериализованному объекту. Я хотел бы изменить это, например, простое имя класса.Сериализация класса XStream и Object

Пример 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> 

Я хотел бы изменить com.example.PossibleClass к PossibleClass или что-то другое. Это возможно?

+0

Единственное, что я могу сказать о это то, что '' возможноClass'' без имени пакета может вызвать проблемы десериализации, когда несколько пакетов содержат класс этого имени. Для этого это может быть невозможно. –

ответ

6

Да, вы можете! Это помогает уменьшить размер сгенерированного документа. Это хорошая практика.
Использование XStream.alias() метод.

Это работает для меня.

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

Без псевдонима

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

С псевдонимом

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

ли ниже подход не работает?

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

Смежные вопросы