Browsing
Information
Calendar
Date
desc





XStream

TOC

About

XStream is a simple library to serialize objects to XML and back again.

http://xstream.codehaus.org/

Esperienze

Prima segnalazione di Marco:

l'uso e' incredibilmente semplice

  • scrive:
XStream xstream = new XStream();
xstream.toXML(myMap, fh); // serialize to XML
  • legge:
XStream xstream = new XStream(new
       com.thoughtworks.xstream.io.xml.DomDriver());
myMap = (HashMap)xstream.fromXML(fh);

nel caso particolare myMap e' un HashMap di un'oggetto con tipi interi, stringa e un arraylist

ps: x nicola, sta notte mi ha generato file da 40mb!

------------
Riporto qui sotto le esperienze di Michele conl'uso di XStream:

---
L'esigenza era quella di convertire una struttura di classi (un po' complessa) che implementano in sostanza descrittori di configurazione di un applicativo.

La soluzione precedente usava una semplice serializzazione su file, che come ben sappiamo ha i seguenti svantaggi:

  • incompatibilita' tra versioni diverse se si modifica la struttura degli oggetti serializzati
    (ad es aggiunta di attributi)
  • obbligo di usare un applicativo java per poter leggere / modificare il file

XStream offre la possibilita' di convertire questo scenario in una scrittura/lettura XML con uno sforzo davvero minimo.

Sostanzialmente e' gia' sufficiente sostituire un codice tipo:

ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream
 (file));
 out.writeObject(resources);

con qualcosa tipo:

XStream xstream = new XStream();
PrintWriter out = new PrintWriter(new FileWriter(file));
out.print(xstream.toXML(resources));

(dove resources e' un'istanza della classe contenente la configurazione di cui dicevo sopra).
La conversione della lettura e' altrettanto semplice.

Sul sito di xstream si trovano poi vari hint per un uso piu' "avanzato".

Unico "neo" in cui mi sono imbattuto e che ci ho messo un po' a sgamare:
se la classe che si "serializza" in XML definisce il costruttore "vuoto" (ad es public Resources(){})
la deserializzazione produce un errore (ObjectAccessException).
Il motivo non mi e' ancora chiaro (se vi viene qualche idea postatela) ma e' facilmente riproducibile con il seguente codice:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.Serializable;

public class Test {
public static void main (String args[]){
 Config obj = new Config();
 XStream x = new XStream();

 // toXml
 String xml = x.toXML(obj);
 System.out.println(xml);

 // fromXml
 x.fromXML(xml);
}
}

class Config{
public Config(){} // se lascio questo fromXML si incazza, se lo commento
legge tranquillamente
}

That's all folks

M.

---
Durante la pausa caffe' il mio subconscio ha ricostruito il percorso di prove di stamattina
e ho recuperato la conclusione: il problema di unmarhalling segnalato per le classi
con costruttore vuoto e' dato dall'uso di JVM 1.3, e non si presenta nel caso di JVM 1.4
(tra le varie modifiche che avevo fatto avevo appunto cambiato "target").

Di fatto nelle FAQ sono evidenziate alcune feature differenti tra le modalita' "pure java"
e "enhanced (Sun 1.4)" in cui si cita (anche se non molto chiaramente) l'aspetto del default constructor.

Verificato col programmillo di test.

Bye...

M.

Add your comment