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
XStream xstream = new XStream();
xstream.toXML(myMap, fh); // serialize to XML
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.