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 :

alias avec champs identique pour classes differentes [XStream]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut alias avec champs identique pour classes differentes
    Bonjour,

    Je veux sérialiser un fichier XML de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <LIST>
      <A>
        <C1></C1>
        <C2></C2>
      </A>
      <B>
        <C1></C1>
        <C2></C2>
      </B>
    </LIST>
    Mon code java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    XStream x = new XStream(new DomDriver());
    		// class mapping
    		x.alias("LIST", List.class);
    		x.alias("A", A.class);
    		x.alias("B", B.class);
     
    		x.addImplicitCollection(List.class, "as");
    		x.addImplicitCollection(List.class, "bs");
     
    		x.aliasField("C1", A.class, "c1");
    		x.aliasField("C2", A.class, "c2");
    		x.aliasField("C1", B.class, "c1");
    		x.aliasField("C2", B.class, "c2");
     
    		List list = (List) x.fromXML(xml);
     
    		System.out.println(list.toString());
    Class List :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    public class List {
     
    	private List<A> as = new ArrayList<A>();
    	private List<B> bs = new ArrayList<B>();
     
     
    	public MPMAccessList(List<A> as, List<B> bs) {
    		super();
    		this.as = as;
    		this.bs = bs;
    	}
    	public MPMAccessList() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	public List<A> getas() {
    		return as;
    	}
    	public void setas(List<A> as) {
    		this.as = as;
    	}
    	public List<B> getbs() {
    		return bs;
    	}
    	public void setbs(List<B> bs) {
    		this.bs = bs;
    	}
    	@Override
    	public String toString() {
    		StringBuilder s = new StringBuilder();
    		s.append(" to delete : ");
    		if (as != null) {
    			for (A td : as) {
    				s.append("\n\t");
    				s.append(td.toString());
    			}
    		} else {
    			s.append(" List null");
    		}
    		s.append("\n to record : ");
    		if (bs != null) {
    			for (B tr : bs) {
    				s.append("\n\t");
    				s.append(tr.toString());
    			}
    		} else {
    			s.append(" List null");
    		}
    		return s.toString();
    	}
    }
    Classe A et B (identiques au nom près) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public class A {
     
    	private String c1;
    	private String c2;
     
    	public A() {
    		super();
    	}
     
    	public A(String c1, String c2) {
    		super();
    		this.c1 = c1;
    		this.c2 = c2;
    	}
    	public String getc1() {
    		return c1;
    	}
    	public void setc1(String c1) {
    		this.c1 = c1;
    	}
    	public String getc2() {
    		return c2;
    	}
    	public void setc2(String c2) {
    		this.c2 = c2;
    	}
     
    	@Override
    	public String toString() {
    		StringBuilder st = new StringBuilder();
    		st.append("c2 = ");
    		st.append(c2);
    		st.append(", c1 = ");
    		st.append(c1);
    		return st.toString();
    	}
    }
    L'erreur survient quand je fais un list.toString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.lang.ClassCastException: project.bean.A cannot be cast to project.bean.B
    	at project.bean.List.toString(List.java:51)
    C'est la ligne suivante :

    D'après ce que j'ai compris, tout les champs C1 et C2 du xml d'entrée sont associée aux attributs c1 et c2 de la classe A sans distinction de balise parente. Y'a t-il moyen de spécifier dans quel cas associer C1 à A.c1 ou a B.c1?

    Merci d'avance.

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut
    Si A et B sont identiques alors pourquoi t'utilises pas la même classe. Expose moi ton problème de A à Z pour que je puisse t'aider : tu pars d'un fichier xml d'un certain format avec des balises prédéfinies ? ou tu as le choix ? donne moi un exemple complet de ce que tu veux faire.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je ne connais pas xstream, mais :

    - Lire un XML et le transformer en objets Java, cela s'appelle sérialiser.

    - Si tu places plusieurs addImplicitCollection() sur la même classe, à la sérialisation ça peut très bien se passer.
    Mais à la désérialisation, il ne peut pas deviner dans laquelle des deux collections tu veux insérer les objets lus.
    => on peut imaginer qu'à un moment, un <A> a été lu et inséré dans la liste "bs", or c'est une List<B>. Donc en accédant à ses éléments, ils sont castés en B. Un A ne peut pas être casté en B.
    => ClassCastException
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Par défaut
    Effectivement, mes objets sont tous insérés dans la premiere collection. Mais il sont bien de type A ou B ce qui reste l'info essentielle pour le traitement suivant. J'ai plusieurs fichiers XML où le problème se pose (pas la main dessus), je vais faire qu'une seule collection sans définir le type et faire un test sur le type pour orienter le traitement. Ca reste plus simple qu'une lecture DOM.

    Merci bien.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par lapin_hobbit Voir le message
    Effectivement, mes objets sont tous insérés dans la premiere collection. Mais il sont bien de type A ou B ce qui reste l'info essentielle pour le traitement suivant. J'ai plusieurs fichiers XML où le problème se pose (pas la main dessus), je vais faire qu'une seule collection sans définir le type et faire un test sur le type pour orienter le traitement. Ca reste plus simple qu'une lecture DOM.

    Merci bien.
    Personnellement je jetterais d'abord un coup d'œil à http://xstream.codehaus.org/javadoc/....lang.Class%29

    mais bon, ne connaissant pas XStream, je me trompe peut-être.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/07/2011, 17h22
  2. Requete avec champs identiques & cumuler champs différents
    Par guigui69 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 08/06/2011, 08h01
  3. Réponses: 3
    Dernier message: 02/03/2010, 08h14
  4. [SQL] Requête SQL avec champ identique
    Par morgan47 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/10/2007, 20h53
  5. Réponses: 9
    Dernier message: 02/05/2006, 21h17

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