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