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:
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:
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:
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:
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:
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