2017-07-26 3 views
0

Je suis conscient qu'un ObjectOutputStream/ObjectInputStream utilise des en-têtes et ce n'est pas vraiment un cas d'utilisation correct. Mais de toute façon je besoin de pour envelopper certaines données en utilisant les interfaces DataInput et DataOutput.Comment (dé) sérialiser correctement un byte-array en utilisant un ObjectOutputStream & ObjectInputStream?

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     byte[] array = serialize("test"); 
     String deserialized = deserialize(array); 

     System.out.println(deserialized); 
    } 

    private static byte[] serialize(String test) { 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

     try { 
      ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); 

      objectOutputStream.writeUTF(test); 

      byteArrayOutputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return byteArrayOutputStream.toByteArray(); 
    } 

    private static String deserialize(byte[] array) { 
     String temp = null; 

     try { 
      ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(array)); 

      temp = objectInputStream.readUTF(); 

      objectInputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return temp; 
    } 
} 

Je ne comprends vraiment pas comment cela fonctionne. Ai-je raison, que le problème sont ces en-têtes actuellement?

+0

Qu'est-ce qui ne fonctionne pas? Vous avez une exception ou un mauvais résultat? Aussi pouvez-vous fournir [exemple de travail minimal] (https://stackoverflow.com/help/mcve) dans votre message. – talex

+0

@talex Il lance une exception EOFException. S'il vous plaît jeter un oeil [ici] (http://ideone.com/iIC9TI) – Tobseb

+0

Vous devez envoyer votre code dans votre question parce que les ressources externes ne sont pas fiables, une personne à l'avenir peut avoir le même problème, mais cela ne peut comprendre votre question en raison de lien brisé. Cette fois, je l'ai fait pour vous, mais s'il vous plaît faites-le vous-même à l'avenir. – talex

Répondre

2

Vous devez appeler objectOutputStream.flush(); avant la fermeture byteArrayOutputStream.

ObjectOutputStream ont sa mémoire tampon interne de sorte que vous avez été en commençant seulement chaîne dans votre tableau d'octets.

+0

Pourriez-vous s'il vous plaît s'en tenir à la question? :) Bien sûr, vous avez raison, mais cela ne change rien: http://ideone.com/dAsGdO – Tobseb

+0

Vous devez rincer '' objectOutputStream' pas byteArrayOutputStream'. Flush 'byteArrayOutputStream' est inutile. Il écrit toujours directement dans le tampon. – talex

+0

@Tobseb, dans votre code, vous devriez faire 'objectOutputStream.writeUTF (test); \t \t \t objectOutputStream.flush(); \t \t \t byteArrayOutputStream.close(); ' –