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 :

Problème de sérialisation d'objet [JAXB]


Sujet :

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

  1. #1
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut Problème de sérialisation d'objet
    Bonjour,
    j'essaye d'envoyer des données par réseau entres plusieurs appli. Pour ca j'essaye de m'appuyer sur JAXB, et ca fonctionne presque, sauf pour une classe a serialiser.
    j'ai créé une classe XmlTool pour serialiser et deserialiser :
    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
     
    public class XmlTool {
     
    	public XmlTool() {
    	}
     
    	public static String encodeToString( Object object ) {
    		String retour = null;
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
    		try {
    			System.out.println( object.getClass() );
                JAXBContext context = JAXBContext.newInstance( MessageMessageTexte.class );
                Marshaller m = context.createMarshaller();
     
                m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
               m.marshal(object, baos );
                retour = new String( baos.toByteArray() ).trim();
            } catch (JAXBException e) {
                e.printStackTrace();
            }
     
    		return retour;
    	}
     
    	public static Object decodeFromString( String strXml, Class< ? > classe ) {
    		Object objet = null;
    		System.out.println( classe );
    		try {
                JAXBContext context = JAXBContext.newInstance( classe );
                Unmarshaller un = context.createUnmarshaller();
                objet = un.unmarshal( new ByteArrayInputStream( strXml.getBytes() ) );
            } catch (JAXBException e) {
                e.printStackTrace();
            }
            return objet;
    	}
    }
    un objet generic :
    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
     
    @XmlRootElement(name = "Message")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(propOrder = { "boxEmetteur", "boxEmetteurVirtuel", "boxDestinataire", "typeAction", "typeObjet", "data" })
    public class Message<T> {
    	protected Box boxEmetteur;
    	protected Box boxEmetteurVirtuel;
    	protected Box boxDestinataire;
     
    	protected ETypeMessage typeAction;
    	protected ETypeObject typeObjet;
     
    	@XmlAnyElement(lax=true)
    	protected T data;
     
    	public Message() {
    		super();
    	}
    ...
    dans ce message générique, dans ma data je mets plusieurs type d'objets comme celui la :

    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
     
    @XmlRootElement(name = "Box")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(propOrder = { "id", "type", "ip", "nom", "mac", "coordX", "coordY", "cheval", "camera" })
    public class Box {
    	private int id;
    	private int type;
    	private String nom;
    	private String ip;
    	private String mac;
    	private int coordX;
    	private int coordY;
    	private Cheval cheval;
    	private Camera camera;
     
    	public Box() {
    		this.id = 0;
    		this.type = 0;
    		this.nom = "";
    		this.ip = "";
    		this.mac = "";
    		this.coordX = 0;
    		this.coordY = 0;
    		this.cheval = null;
    		this.camera = null;
    	}
    ca fonctionne impec.
    Par contre j ai un autre objet qui lui me sort une erreur :

    javax.xml.bind.MarshalException
    - with linked exception:
    [com.sun.istack.internal.SAXException2: class bdd.modele.MessageText ni aucune de ses superclasses n'est connue dans ce contexte.
    javax.xml.bind.JAXBException: class bdd.modele.MessageText ni aucune de ses superclasses n'est connue dans ce contexte.]
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(Unknown Source)
    at xml.XmlTool.encodeToString(XmlTool.java:34)
    at test.testGeneral.main(testGeneral.java:60)

    voila l'objet en question :
    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
     
    @XmlRootElement(name = "MessageText")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(propOrder = { "idBox", "dateEmission", "texte" })
    public class MessageText {
    	private int idBox;
    	private Date dateEmission;
    	private String texte;
     
    	public MessageText() {
    		super();
    	}
     
    	public MessageText(int idBox, Date dateEmission, String texte) {
    		super();
    		this.idBox = idBox;
    		this.dateEmission = dateEmission;
    		this.texte = texte;
    	}
    ...
    Tous mes objets ont les getter/setter correspondant aux attributs.
    Je ne vois aucune difference entre les 2 codes.
    J'ai raté un truc ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Message<Box> message = new Message<Box>( emetteur, virtuel, destinataire, ETypeMessage.Info, ETypeObject.Box, emetteur);
    		Message<MessageTexte> message2 = new Message<MessageTexte>( emetteur, virtuel, destinataire, ETypeMessage.Info, ETypeObject.InfoTexte, new MessageTexte( 1, new Date(), "test1" ));
     
    		String str = XmlTool.encodeToString( message );
    		System.out.println( str );
    		Message<Box> retour1 = (Message<Box>)XmlTool.decodeFromString( str, message.getClass() );
    		System.out.println( retour1 );
     
    		str = XmlTool.encodeToString( message2 );
    		System.out.println( str );
    		Message<MessageTexte> retour2 = (Message<MessageTexte>)XmlTool.decodeFromString( str, message2.getClass() );
    		System.out.println( retour2 );
    L'erreur arrive sur XmlTool.encodeToString( message2 );
    alors que XmlTool.encodeToString( new MessageTexte( 1, new Date(), "test1" )); fonctionne lui
    je ne comprends rien
    "vaste programme"

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Bon, j'ai trouvé une solution :
    @SeeAlso ({ MessageText.class, Box.class, ... })

    sur ma classe Message<T> ca fonctionne.
    bon, c'est tombé en marche...
    "vaste programme"

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

Discussions similaires

  1. Probleme de serialisation d'objet
    Par hannibal.76 dans le forum Langage
    Réponses: 2
    Dernier message: 02/07/2010, 17h27
  2. Probleme avec l'objet PDO en PHP
    Par krovomi dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 03/05/2006, 12h18
  3. Réponses: 2
    Dernier message: 28/03/2006, 03h36
  4. serialiser des objets
    Par bfb dans le forum Langage
    Réponses: 2
    Dernier message: 30/07/2005, 23h07
  5. [VB6]Sérialiser un objet
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 11/10/2003, 10h05

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