StreamCorruptedException: code de type non valide: AC

Mon problème est quand il essaie de lire l’object la deuxième fois, il lève l’exception:

java.io.StreamCorruptedException: invalid type code: AC at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at Client.run(BaseStaInstance.java:313) java.io.StreamCorruptedException: invalid type code: AC at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at Client.run(BaseStaInstance.java:313) 

La première fois, j’envoie exactement le même message d’object; Cependant, lorsque j’essaie de faire la même chose la deuxième fois, l’erreur ci-dessus apparaît. Dois-je ré-initialiser la méthode readObject ()? J’ai même imprimé l’object de message qui est reçu par la ligne ci-dessous et son exact comme la première instance où cela fonctionne correctement.

 Object buf = myInput.readObject(); 

Je suppose qu’il y a un problème avec l’ajout, mais je n’ai vraiment aucun intérêt à append. Je veux juste lire une nouvelle ligne à chaque fois. J’apprécierais vraiment de l’aide pour résoudre ce problème. Je vous remercie.

==================================

Avant cette ligne, je ne fais que créer les objects d’entrée et de sortie du socket dans la méthode run (). La déclaration d’object est en dehors de la méthode run () dans la classe: –

 @Override public void run() { try { sleep((int) 1 * 8000); } catch (Exception e) { e.printStackTrace(); } try { //Creating input and output streams to transfer messages to the server myOutput = new ObjectOutputStream(skt.getOutputStream()); myInput = new ObjectInputStream(skt.getInputStream()); while (true) { buf = myInput.readObject(); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { } catch (Exception e) { e.printStackTrace(); } } } 

Tu as raison; Je ne ferme pas l’object. Je ne sais pas comment faire ça.

Le problème sous-jacent est que vous utilisez un nouvel object ObjectOutputStream pour écrire dans un object ObjectInputStream existant ObjectInputStream lequel vous avez déjà utilisé un object ObjectOutputStream antérieur. Ces stream ont des en-têtes qui sont écrits et lus par les constructeurs respectifs, donc si vous créez un autre ObjectOutputStream vous écrirez un nouvel en-tête, qui commence par – devinez quoi? – 0xAC, et l’ ObjectInputStream existant ObjectInputStream pas un autre en-tête à ce stade, donc il barfs.

Dans le forum Java Forums cité par @trashgod, j’aurais dû laisser de côté la partie concernant «à nouveau pour chaque object aux deux extrémités»: c’est du gaspillage. Utilisez un seul OOS et OIS pour la durée de vie du socket et n’utilisez aucun autre stream sur le socket.

Si vous voulez oublier ce que vous avez écrit, utilisez ObjectOutputStream.reset().

Et n’utilisez pas d’autres stream, Readers ou Writers sur le même socket. Les API de stream d’objects peuvent gérer tous les types de données primitifs Java et toutes les classes Serializable .