Archivio per Maggio, 2006

Serializzare in XML con XStream

Maggio 26, 2006

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!

Dalle puzze al loro refactoring

Maggio 10, 2006

Joshua Kerievsky ha reso pubblica una simpatica tabellina che associa la puzza al refactoring necessario per eliminarla : http://industriallogic.com/papers/smellstorefactorings.pdf

Kerievsky è l’autore di Refactoring to Patterns, ’nuff said.