Serializzare in XML con XStream

L’anno scorso cercavo il modo di serializzare un gran numero di oggetti appartenenti a qualche dozzina di classi diverse. Volevo che la serializzazione fosse “leggibile”, quindi la Java Serialization classica non si addiceva, inoltre volevo che fosse -veramente- poco invasiva del sistema (e qui immagino che si dirà subito : perchè non hai progettato in anticipo la persistenza del tuo sistema e quindi non riesci a farlo ben aderire a un framework di persistenza un po’ serio, ma questo è un altro discorso).

La leggibilità è arrivata dall’XML, la comodità d’uso è invece arrivata da una libreria opensource che, ad oggi, mi ha davvero dato molto : XStream (http://xstream.codehaus.org/).

Se non si vogliono effetti speciali, si inizializza il serializzatore così :
XStream serializer = new XStream();

E poi si può serializzare un qualsiasi oggetto così :
String serializedObject = serializer.toXML(myVeryBigObject);

Questo è sufficiente a serializzare un qualsiasi oggetto e tutti gli oggetti a cui esso fa riferimento e così via.
E’ molto solido, nell’ultima versione gestisce perfettamente le novità della 5.0 e la serializzazione/deserializzazione mantiene tutti i riferimenti.

Quello che mi piace di più però è che l’XML è estremamente compatto (ebbene sì, dell’XML senza sbrodolature e non mi sono nemmeno cadute le dita dalle mani mentre scrivevo una tale eresia!), ecco il risultato della serializzazione di un Socket :

<java.net.Socket>
<created>false</created>
<bound>false</bound>
<connected>false</connected>
<closed>false</closed>
<closeLock/>
<shutIn>false</shutIn>
<shutOut>false</shutOut>
<impl class=”java.net.SocksSocketImpl”>
<port>1080</port>
<useV4>false</useV4>
<timeout>0</timeout>
<trafficClass>0</trafficClass>
<shut__rd>false</shut__rd>
<shut__wr>false</shut__wr>
<fdUseCount>0</fdUseCount>
<fdLock/>
<closePending>false</closePending>
<CONNECTION__NOT__RESET>0</CONNECTION__NOT__RESET>
<CONNECTION__RESET__PENDING>1</CONNECTION__RESET__PENDING>
<CONNECTION__RESET>2</CONNECTION__RESET>
<resetState>0</resetState>
<resetLock/>
<lastfd>-1</lastfd>
<socket reference=”../..”/>
<port defined-in=”java.net.SocketImpl”>0</port>
<localport>0</localport>
</impl>
<oldImpl>false</oldImpl>
</java.net.Socket>

Non che mi sognerei mai di serializzare un socket!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s