2012-04-09 66 views
5

Tôi có đậu có các đối tượng có thể chứa các loại khác nhau. Bây giờ khi tôi tạo XML nó sẽ thêm thuộc tính lớp vào đối tượng được tuần tự hóa. Tôi muốn thay đổi điều đó cho ví dụ tên lớp đơn giản.Tuần tự lớp XStream và Object lớp

Ví dụ Java:

public class MyParentClass { 

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

// Getters & setters etc.. 

XStream khởi:

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

Ví dụ XML:

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

Tôi muốn thay đổi com.example.PossibleClass để PossibleClass hay cái gì khác. Điều đó có thể không?

+0

Điều duy nhất tôi có thể nói về đó là '' PossibleClass'' không có tên gói có thể gây ra các vấn đề deserialization khi nhiều gói chứa một lớp của tên đó. Đối với điều này, nó có thể là không thể. –

Trả lời

6

Có bạn có thể! Nó giúp giảm kích thước của tài liệu được tạo ra. Đó là một thực hành tốt để làm như vậy.
Sử dụng phương thức XStream.alias().

này làm việc cho tôi.

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

Nếu không có bí danh

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

Với bí danh

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

là phương pháp dưới đây không làm việc?

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

Hướng dẫn chi tiết. [link] (http://xstream.codehaus.org/alias-tutorial.html) – titogeo

+1

Tôi đã sử dụng nó, và nó không có tác dụng. – newbie

+0

Bạn có thể sao chép mã của mình không? – titogeo

0

Vâng, nếu bạn muốn tên đơn giản của lớp và bạn biết gói của đối tượng bạn có thể:

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

Output xml:

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

Xin vui lòng bỏ qua câu trả lời này, tôi thấy hack này không hoạt động vì 1 gói với bí danh trống gây ra các vấn đề deserialization với các lớp của gói khác. – iberck

Các vấn đề liên quan