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 :
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
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; } }
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 @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(); } ...
ca fonctionne impec.
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; }
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 :
Tous mes objets ont les getter/setter correspondant aux attributs.
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; } ...
Je ne vois aucune difference entre les 2 codes.
J'ai raté un truc ?
L'erreur arrive sur XmlTool.encodeToString( message2 );
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 );
alors que XmlTool.encodeToString( new MessageTexte( 1, new Date(), "test1" )); fonctionne lui
je ne comprends rien
Partager