XStream常見問題解析
XStream所支持的JDK版本
XStream支持JDK1.3及以后的版本
在不同的JVM中XStream運行會有差異嗎?
XStream有兩種運行模式:存Java模式和增強模式。
在存Java模式下,XStream在不同JVM中的運行是一樣的,但由于不同JVM對reflection機制的支持有所差異,會導致一些類或字段將無法序列化。
在增強模式下,XStream沒有上述限制,然而這種模式并不被所有的JVM所支持。
哪種JVM支持XStream以增強模式運行?
目前Sun、Apple、和HP的JVM 1.4或更新的版本支持增強模式。所有的JVM均支持以存Java模式運行。
兩種模式下差異比較
僅以Sun JDK 1.4為例說明兩種模式下,XStream運行的差異。
功能 存Java模式 增強模式
公有類 YES YES
非公有類 NO YES
靜態(tài)內部類 YES YES
非靜態(tài)內部類 NO YES
匿名靜態(tài)內部類 NO YES
無缺省構造函數(shù) NO YES
有缺省構造函數(shù) YES YES
Private字段 YES YES
Final字段 NO YES
如何序列化集合對象?
參考下面的代碼示例:
class Person {
private String name;
private List toys = new ArrayList();
// ...
}
class Computer {
String type;
}
class Car {
String color;
}
xstream.alias("person", Person.class);
xstream.alias("computer", Computer.class);
xstream.alias("car", Car.class);
Person person = new Person("Joe");
person.addToy(new Computer("apple"));
person.addToy(new Computer("spectrum"));
person.addToy(new Car("blue"));
String xml = xstream.toXML(joe);
示例返回結果:
<person>
<name>Joe</name>
<toys>
<computer>
<type>apple</type>
</computer>
<computer>
<type>spectrum</type>
</computer>
<car>
<color>blue</color>
</car>
</toys>
</person>
如果使用XStream序列化對象,對象必須要實現(xiàn)Serializable接口嗎?
不必
動態(tài)代理類能被序列化嗎?
可以
當對象發(fā)生改變時,XStream如何處理?
當對象新增加一個字段時,XStream在反序列化舊版本的對象時,會忽略這個新增的字段,不作任何處理。
當對象刪除一個字段時,XStream在反序列化舊版本的對象(包含該字段)時,會拋出異常信息。
如果對象的字段改名了,將被視作刪除了一個字段,然后再新增一個字段。
對于更高級別的類移植,我們在發(fā)送信息到XStream之前,必須要對XML對象進行預處理。
XStream還在不斷的開發(fā)過程中,相信在未來的版本中,上述操作會更成熟,更容易。
XStream是線程安全的嗎?
是的。一旦XStream實例已經被創(chuàng)建并配置后,它能夠在多線程中共享允許對象并發(fā)的進行序列化和反序列化操作。