IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

[XStream] Désérialiser une collection


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 90
    Points : 43
    Points
    43
    Par défaut [XStream] Désérialiser une collection
    Bonjour,

    j'arrive bien a serialiser une collection, par contre pour la déserialiser c'est vraiment la galère et google n'a pas fait mon affaire jusqu'a present.

    j'ai un useCase simple pour tenter de réussir une déserialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @XStreamAlias("person")
    public class Person {
    	@XStreamAlias("nom")	
    	String nom;
    	@XStreamAlias("id")
    	int age;
    	@XStreamAlias("address")
    	String address;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @XStreamAlias("persons")
    public class PersonList {
    	@XStreamImplicit(itemFieldName = "persons")
    	private List<Person> list;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	public static void main(String[] args) {
     
    		String xml = "<persons><person><nom>ABC</nom><age>12</age><address>address</address></person><person><nom>XYZ</nom><age>20</age><address>address2</address></person></persons>";
    		XStream xStream = new XStream();
    		xStream.processAnnotations(new Class[] { PersonList.class, Person.class });
    		PersonList persons = (PersonList)xStream.fromXML(xml);
    		System.out.println(persons.getList().get(0).getAddress());
    Et j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Element person of type org.mule.application.formationmule.Person is not defined as field in type org.mule.application.formationmule.PersonList
    J'ai essayé de pas mal d'autre façon piqué ici et la sur le web mais rien n'a été concluant.

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Il y a une asymétrie importante entre serialization et déserialization, me semble-il. Pour déserialization, même avec issuance de processAnnotations, on droit expliciter implicite collection par addImplicitCollection, comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        String xml = "<persons><person><nom>ABC</nom><age>12</age><address>address</address></person><person><nom>XYZ</nom><age>20</age><address>address2</address></person></persons>";
        XStream xStream = new XStream();
        xStream.processAnnotations(new Class[] { PersonList.class, Person.class });
        xStream.addImplicitCollection(PersonList.class, "list");    //ajouter cette ligne
        PersonList persons = (PersonList)xStream.fromXML(xml);
        System.out.println(persons.getList().get(0).getAddress());
    Essayez-le.

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Jpense que ceci devrait suffire dans le cas ou t'as défini par annotations.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xStream.autodetectAnnotations(true);
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Jpense que ceci devrait suffire dans le cas ou t'as défini par annotations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xStream.autodetectAnnotations(true);
    Cela devrait equivalent à procéder PersonList.class et Person.class comme fait explicitement dans le message originel. Apart qu'on s'interesse au comptage de lignes de code à minimum, fonctionellement c'est la même. Et c'est là que je donnerais raison à l'op : ce n'est pas sufficent et ça ne marche pas pour le cas-ci. La raison principale ici, c'est aussi qu'on a à la main un cas de déserialization. Or, c'est un problème bien soulevé dans le tutorial
    http://xstream.codehaus.org/annotations-tutorial.html
    en particulière le paragraphe "Chicken-and-egg problem" dans la section "Auto-detect Annotations". Un simple test confirme aussi son insufficence dans ce cas de déserialization.

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    J'ai pas tout compris, mais par contre avec ton exemple du chicken-egg, en effet il est préférable de faire comme tu le préconises
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [XStream] Désérialiser une collection
    Par happyman dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 03/05/2011, 12h54
  2. [xStream] Désérialisation de collection
    Par nims dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 26/10/2010, 13h11
  3. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58
  4. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  5. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo