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

Entrée/Sortie Java Discussion :

Sérialisation puis dé-sérialisation d'objet via String et flux de ByteArray


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2009
    Messages : 17
    Par défaut Sérialisation puis dé-sérialisation d'objet via String et flux de ByteArray
    Bonjour à tous,

    Je travaille actuellement sur un petit système multi-agents (en utilisant la plateforme JADE) et 2 agents doivent s'échanger un objet java (une HashMap classique).

    Le seul type de données pouvant circuler entre les 2 est du texte, il faut donc sérialiser l'objet sous forme de texte, l'envoyer puis le reconstruire à partir de ce texte.

    Après quelques recherches, je pense que je dois utiliser un ByteArrayOutputStream sur lequel je mappe l'ObjectOutputStream dans lequel je sérialise l'objet. J'utilise ensuite la méthode toString() de ByteArrayOutputStream afin d'obtenir une chaîne de caractère. Voici le code côté expéditeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(baos);
    out.writeObject(conferenceTest); // l'HashMap à transmettre
    reponse.setContent(baos.toString()); // contenu du message à envoyer
    Une fois le message envoyé, il faut reconstruire l'objet en utilisant logiquement ByteArrayInputStream et ObjectInputStream. Voici le code côté destinataire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes()); //content étant le contenu du message reçu, donc en théorie l'objet sérialisé
    ObjectInputStream in = new ObjectInputStream(bais); // ligne posant problème
    conferenceTest = (HashMap<String,String>)in.readObject();
    Lors de l'exécution de la 2ème ligne, je rencontre cette exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
    Est-ce que quelqu'un voit d'où peut venir le problème?

    Merci beaucoup

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par pduplouy Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(baos);
    out.writeObject(conferenceTest); // l'HashMap à transmettre
    reponse.setContent(baos.toString()); // contenu du message à envoyer
    Je ne pense pas que le ByteArrayOutputStream contienne des caractères "ascii", et donc je doute que le "baos.toString()" soit une bonne idée.

    Il faut soit envoyer les données en format byte[] par reponse.setByteSequenceContent(), ou alors encoder le contenu du baos en format texte (uuencode, base64, ...)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2009
    Messages : 17
    Par défaut
    Bonjour et merci pour l'aide!

    J'ai suivi votre conseil et j'encode désormais le flux de bytes avec Base64 (en utilisant la classe Base64 (org.apache.commons.codec.binary.Base64). J'obtiens malheureusement toujours la même exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.io.StreamCorruptedException: invalid stream header: 075F746B
    Je pense que je dois mal faire la conversion donc voici le code que j'utilise:

    (expéditeur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    baos = new ByteArrayOutputStream();
    out = new ObjectOutputStream(baos);
    out.writeObject(conferenceTest); //objet à sérialiser
     
    Base64 encodeur = new Base64();
    byte[] bitsEncodes = encodeur.encode(baos.toByteArray());		
    reponse.setContent(bitsEncodes.toString());
    (destinataire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Base64 decodeur = new Base64();
    //content est le contenu texte du message 
    byte[] bitsDecodes = decodeur.decode(content.getBytes()); 
     
    bais = new ByteArrayInputStream(bitsDecodes);
    in = new ObjectInputStream(bais); // invalid stream header
    hm = (HashMap<String,String>)in.readObject();
    Est-ce que le problème vient de mon encodage/décodage en Base64?

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par pduplouy Voir le message
    Est-ce que le problème vient de mon encodage/décodage en Base64?
    Non, je ne pense pas. On dirait que la stream est invalide. Regarde la taille des données envoyées/reçues pour voir si c'est la même.

    PS: et pense a faire un close() sur les streams.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2009
    Messages : 17
    Par défaut
    Résolu!

    En effet le problème provenait du flux qui était foireux, je m'en suis rendu compte en comparant les tailles des objets à chaque étape.

    En fait j'utilisais la méthode toString() de byte[], puis la méthode getBytes() de String dans l'espoir de récupérer mon tableau de bits original, alors qu'il fallait plutôt utiliser le constructeur String(byte[]) à la place de la méthode toString().

    Encore merci pour l'aide

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

Discussions similaires

  1. Sérialisation d'un tableau d'objets
    Par Yoan_ dans le forum Langage
    Réponses: 15
    Dernier message: 23/03/2009, 20h17
  2. [WD12]Sérialiser une instance de l'objet en cours
    Par peijnoob dans le forum WinDev
    Réponses: 3
    Dernier message: 18/12/2008, 16h47
  3. Sérialisation d'objets via QDataStream
    Par thms92 dans le forum Qt
    Réponses: 1
    Dernier message: 03/09/2008, 19h14
  4. La sérialisation en XML d'un Objet partiellement chargé (JPA)
    Par mesios dans le forum Persistance des données
    Réponses: 2
    Dernier message: 22/05/2008, 11h45
  5. Réponses: 4
    Dernier message: 12/12/2006, 10h22

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