對象圖
XStream支持對象圖,也就是“反序列化”一個對象的時候?qū)3衷瓉淼膶ο笠藐P(guān)系,這其中包括循環(huán)引用關(guān)系。?我們可以指定XStream是使用XPath還是IDs來實現(xiàn)對象引用的這種處理方式,指定的方式就是調(diào)用XStream的setMode方法,此方法有XStream.XPATH_REFERENCES、XStream.ID_REFERENCES、XStream.NO_REFERENCES三個選項。其意義分別如下:
XStream.XPATH_REFERENCES:這是默認(rèn)值。這個選項指定XStream使用XPath引用方式處理重復(fù)引用。
XStream.ID_REFERENCES:這個選項指定XStream使用ID引用方式處理重復(fù)引用。當(dāng)使用手寫XML的時候,這種方式可能更好用一些。?
XStream.NO_REFERENCES:這個選項指定XStream不支持圖引用,將對象結(jié)構(gòu)當(dāng)做樹狀處理。重復(fù)的引用將會被認(rèn)為是兩個獨立的對象,而循環(huán)引用將會導(dǎo)致一個異常。這種方式速度會更快一些,并且相對于前兩者來說占用更少的內(nèi)存。
自定義轉(zhuǎn)換器
XStream對String, Date, int, boolean等基本類型以及Map, List, Set, Properties等集合類型提供了轉(zhuǎn)換器,因此這些類型可以輕松的實現(xiàn)序列化和反序列化。如果您使用的數(shù)據(jù)類型不被XStream支持,那么就需要自定義數(shù)據(jù)轉(zhuǎn)換器。自定義轉(zhuǎn)換器要實現(xiàn)com.thoughtworks.xstream.converters.Converter接口,這個接口定義了如下三個方法:
boolean canConvert(Class type);
void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context);
Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context);
這三個方法分別表示:type這個類型的數(shù)據(jù)此轉(zhuǎn)換器是否有能力轉(zhuǎn)換;將對象進(jìn)行編組(marshal)為XML格式;將XML格式反編組(unmarshal)為對象。
我們通常無需直接實現(xiàn)該接口,而是繼承com.thoughtworks.xstream.converters.MarshallingContext.AbstractBasicConverter抽象類,然后覆蓋:
protected String toString(Object obj)
protected Object fromString(String str);
兩個方法即可。可以參考com.thoughtworks.xstream.converters.extended.SqlTimestampConverter的實現(xiàn)代碼。
轉(zhuǎn)換器開發(fā)完畢以后調(diào)用XStream類的public void registerConverter(Converter converter)方法注冊轉(zhuǎn)換器。