2009-06-16 15 views
3

J'essaye de désérialiser une chaîne en Java en utilisant le paquet XStream. Le paquet XStream peut sérialiser ma classe. Je reçois le XML (ne peut pas changer le format de XML) d'un serveur et essaye de sauvegarder ses informations de noeud aux variables correspondantes dans une certaine classe. Ma fonction est en bas et j'ai essayé d'enregistrer un nouveau convertisseur pour l'objet XStream (en pensant que c'était parce qu'une variable est un tableau d'octets) mais toujours pas de chance. Quelqu'un peut-il faire la lumière sur ces exceptions? Ai-je besoin d'enregistrer "MyClass" et d'écrire mon propre convertisseur pour XStream pour gérer la désérialisation de ma classe? Merci d'avance.XStream fromXML() exception

Exception si une chaîne ou d'un objet StringReader sont passés dans fromXML() en entrée:

[erreur irrécupérable]: 1: 1: Contenu est interdit dans prolog.
com.thoughtworks.xstream.io.StreamException:: Le contenu n'est pas autorisé dans le prologue.
à com.thoughtworks.xstream.io.xml.DomDriver.createReader (DomDriver.java:86)
à com.thoughtworks.xstream.io.xml.DomDriver.createReader (DomDriver.java:66)
au com .thoughtworks.xstream.XStream.fromXML (XStream.java:853)

Exception si ByteArrayInputStream est utilisé comme entrée pour fromXML():

com.thoughtworks.xstream.converters.ConversionException: ByteSize : ByteSize: ByteSize: ByteSize
---- Debuggi ng informations ----
message: ByteSize: ByteSize
cause exception: com.thoughtworks.xstream.mapper.CannotResolveClassException
cause message: ByteSize: ByteSize
Classe: MyClass
-type requis: MyClass
chemin :/MyClass/ByteSize
à com.thoughtworks.xstream.core.TreeUnmarshaller.convert (TreeUnmarshaller.java:89)
à com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert (AbstractReferenceUnmarshaller.java:63)
à com.though tworks.xstream.core.TreeUnmarshaller.convertAnother (TreeUnmarshaller.java:76)
à com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother (TreeUnmarshaller.java:60)
à com.thoughtworks.xstream.core.TreeUnmarshaller. démarrer (TreeUnmarshaller.java:137)
à com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal (AbstractTreeMarshallingStrategy.java:33)
à com.thoughtworks.xstream.XStream.unmarshal (XStream.java:923)
à com.thoughtworks.xstream.XStream.unmarshal (XStream.java:909)
à com.thoughtworks.xstream.XStream.fromXML (XStream.java:861)

static Object fromXmlString(String xml) 
{ 
    XStream xStream = new XStream(new DomDriver()); 
    xStream.registerConverter(new EncodedByteArrayConverter()); 
    //tried all 3 below 
    //return xStream.fromXML(new StringReader(xml)); 
    //return xStream.fromXML(new ByteArrayInputStream(xml.getBytes())); 
    return xStream.fromXML(xml); 
} 

Répondre

4

Jetez un oeil à cette question: content not allowed in prolog exception.

"Contenu non autorisé en prologue" signifie généralement qu'il y a du contenu avant l'en-tête <?xml (le "prologue") dans le fichier. Ceci n'est pas autorisé.Par conséquent, vérifiez qu'il n'y a aucun caractère avant <?xml dans la chaîne, et également que vous n'avez aucun problème BOM.

+0

Vous avez raison. quand j'imprime l'entrée de chaîne passée, il y a trois caractères indésirables avant le

+0

Ok, vous devez simplement vous assurer que le contenu est supprimé avant d'essayer de le désérialiser. Je vous suggère de le faire vous-même avant d'invoquer XStream, ou si ces données proviennent de quelqu'un d'autre, dites-leur de le réparer. –

+0

J'ai enlevé les caractères indésirables sur mon extrémité en s'assurant que la chaîne "commence" avec l'en-tête xml correct. mais maintenant j'obtiens l'exception de ConversionException même avec la chaîne en tant qu'entrée (où comme la chaîne précédemment donnait ce "contenu non autorisé en prologue") –

0

Votre instance XStream de désérialisation/décodage est-elle configurée en mode comme instance de codage XStream? Je vérifierais ce dernier, et m'assurerais que la même instance de XStream peut coder/décoder.

+0

La chaîne XML est en cours d'encodage en C#, donc je ne peux vraiment pas faire de comparaison là-bas. Je crois qu'ils utilisent la classe XmlSerializer fournie par .net –

+0

Je pense que vous pouvez avoir beaucoup de travail devant vous (en fonction du XML que vous devez désérialiser). Je m'attendrais à ce que XStream présume qu'il a également effectué la sérialisation. Il peut être utile d'afficher le XML que vous devez désérialiser. –

+0

Il n'y a rien de spécial à propos du XML. Il s'agit juste d'un nœud racine et d'environ 25 nœuds enfants de types de données différents (byte array, string, int, boolean). Je suis d'accord, il peut supposer XStream sérialisé les données XML exemple, il ne désérialiser pas vrai Exemple texte ...

4

Il s'agit d'un problème de codage. De l'XStream documentation:

"Toutes les implémentations de HierarchicalStreamDriver respectent l'encodage depuis la version 1.3, mais seulement si vous fournissez un InputStream."

Ajoutez simplement un lecteur lorsque vous essayez de lire le fichier XML. Par exemple:

Object obj = xStream.fromXML(new FileReader(xmlFile)); 
+0

Cela a fonctionné pour moi. Le problème que j'ai rencontré était quand je lis le fichier XML généré avec la fonction toXML. Lorsque j'ai enveloppé le fichier avec un FileReader, XStream a commencé à lire le fichier correctement. –