Object String String Object Linux Ubuntu Java

Fermé
szfzf - Modifié le 8 mai 2018 à 13:58
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 10 mai 2018 à 07:07
Bonjour,

Les mêmes codes se serialization deserialization marchent sur Windows mais pas sur Linux Ubuntu

Morceau morceau2 = null;

  try {
    
       ByteArrayOutputStream bo = new ByteArrayOutputStream();
       ObjectOutputStream so = new ObjectOutputStream(bo);
       so.writeObject(morceau);
       so.close();
       
      retour =  bo.toString();
       
   } catch (Exception e) {
       System.out.println(e);
   }
    
  try {

      byte b[] = retour.getBytes(); 
      ByteArrayInputStream bi = new ByteArrayInputStream(b);
      ObjectInputStream si = new ObjectInputStream(bi);
       morceau2 = (Morceau) si.readObject();
      
      
  } catch (Exception e) {
      System.out.println(e);
  }
 
System.out.println("Titre morceau reconstitue " + morceau2.titre);



java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
java.lang.NullPointerException


Pouvez-vous m'aider ?

Merci d'avance.
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 8 mai 2018 à 14:10
Bonjour,

bo.toString();
va dépendre de l'encodage du système (différent entre Windows et Linux).

Dans la mesure où les bytes que tu manipules sont des données binaires, il n'y a aucune raison de faire de la conversion en texte (avec String), il vaudrait donc mieux t'en passer.

byte[] b = bo.toByteArray();

0
Merci, j'ai besoin de "transporter" la classe serialize dans une String avant de la reconvertir en classe
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > szfzf
8 mai 2018 à 15:01
Alors fait ta conversion dans un encodage prédéfini, qui ne dépend pas du système.

retour =  bo.toString(charset);
byte[] b = retour.getBytes(charset);
0
Morceau morceau2 = null;

try {

ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream so = new ObjectOutputStream(bo);
so.writeObject(morceau);
so.flush();

retour = bo.toString("UTF-8");

} catch (Exception e) {
System.out.println(e);
}

try {

byte b[] = retour.getBytes("UTF-8");
ByteArrayInputStream bi = new ByteArrayInputStream(b);
ObjectInputStream si = new ObjectInputStream(bi);
morceau2 = (Morceau) si.readObject();


} catch (Exception e) {
System.out.println(e);
}


Mêmes erreurs
0
SVP, j'ai vraiment besoin que ça marche pour pouvoir valider mon semestre
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > szfzf
8 mai 2018 à 21:19
Autres causes possibles d'erreurs : tu n'as pas fermé tes flux, donc il manque peut être des octets à la fin.
Le mieux serait de faire des try-with-resources.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
0