2009-06-12 11 views
1

J'utilise un petit morceau sympa de xstream pour effectuer la sérialisation.Backward Compatible dans xstream

J'ai la classe suivante:

// version 0 
class A { 
} 

// version 1 
class A { 
    Object o = new Object(); 
} 

Pour moi de lire la version 0 fichier xml pour construire la version 1 classe A, je vais devoir ajouter la méthode suivante dans la version 1 classe A:

class A { 
    private Object readResolve() 
    { 
     /* For backward compatible */ 
     if (o == null) { o = new Object(); } 
    } 
    Object o = new Object(); 
} 

Cela fonctionne très bien jusqu'à présent.

Maintenant, la situation est inversée.

J'ai la classe suivante:

// version 0 
class A { 
    Object o = new Object(); 
} 

// version 1 
class A { 
} 

Comment puis-je en mesure de faire la lecture de la version du fichier xml 0, pour construire la classe A version 1?

est ici l'exception que vous allez obtenir, si vous essayez de le faire:

run: 
com.thoughtworks.xstream.converters.ConversionException: a : a 
---- Debugging information ---- 
message    : a : a 
cause-exception  : com.thoughtworks.xstream.mapper.CannotResolveClassException 
cause-message  : a : a 
class    : javaapplication15.Main$A 
required-type  : javaapplication15.Main$A 
path    : /javaapplication15.Main$A/a 
line number   : 2 
------------------------------- 
null 
BUILD SUCCESSFUL (total time: 2 seconds) 
+0

Qu'est-Xstream dire si vous deserialize en utilisant des documents XML avec des choses supplémentaires dedans? –

Répondre

1

Actuellement, je rencontre rétrocompatible en utilisant la stratégie suivante:

// version 0 
class A { 
    Object o = new Object(); 
} 

// version 1 
class A { 
    // This will ensure o will not be be read, or be written into file. 
    // transient keyword which prevent read, will only work well for xstream 1.3.1 
    transient Object o = new Object(); 
} 

// version 2. Slowly phase out Object o, after class A had been deployed for quite sometime. 
class A { 
} 
+0

Comme décrit dans la FAQ XStream: http://xstream.codehaus.org/faq.html#Serialization_newer_class_versions –

0

Vous pouvez enregistrer un convertisseur de mesure pour la classe A, qui vous permet de contrôler la msrshalling et unmarshalling. C'est une solution assez lourde, et rend XStream moins attrayant. C'est à cause de ces cas que j'ai tendance à éviter XStream pour tout ce qui n'est pas très trivial, et jamais pour les situations où le XML pourrait être conservé au-delà de la durée de vie de l'application en cours d'exécution. C'est juste trop fragile (et buggé). Un cadre de marshaling plus robuste serait par choix, même s'ils prennent plus d'effort initial pour configurer.

+0

"Vous pouvez enregistrer un convertisseur personnalisé pour la classe A" -> Pouvez-vous décrire plus en détail? Cette déclaration est trop abstraite pour moi. –

+0

La classe XStream vous permet d'enregistrer des convertisseurs qui lui indiquent comment convertir des objets vers et depuis XML. Vous pouvez en écrire un qui sait comment gérer les objets de classe A. – skaffman

Questions connexes