2010-03-06 13 views
26

Il mio problema è quando si cerca di leggere l'oggetto per la seconda volta, si genera l'eccezione:StreamCorruptedException: Codice di tipo non valido: AC

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 prima volta che mando il messaggio esatto stesso oggetto; tuttavia, quando provo a fare la stessa cosa la seconda volta, lancia l'errore sopra. Devo re-intializzare il metodo readObject()? Ho anche stampato l'oggetto messaggio ricevuto dalla riga sottostante ed è esattamente lo stesso della prima istanza in cui funziona correttamente.

Object buf = myInput.readObject(); 

Sto assumendo c'è qualche problema con aggiungendo, ma ho davvero alcuna utilità per l'aggiunta. Voglio solo leggere una nuova linea ogni volta. Apprezzerei molto l'aiuto nel correggere questo bug. Grazie.

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

Prima che una linea, io sono semplicemente creando gli oggetti di input e output per il socket nel metodo run(). La dichiarazione dell'oggetto è esterna al metodo run() della 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(); 
     } 
    } 
} 

Hai ragione; Non chiudo l'oggetto. Non sono sicuro di come farlo.

+0

non sono sicuro dove poter chiudere l'oggetto –

+0

NB Si dovrebbe prendere EOFException e non trattarlo come errore: non registrare o stampare la traccia dello stack; lascia che finisca il ciclo di lettura. Non so perché stai rilevando UnknownHostException dove ti trovi: non può essere lanciato dall'interno del blocco try corrispondente. Il sonno() è letteralmente una perdita di tempo. Rimuoverla. – EJP

risposta

54

Il problema sottostante è che si sta utilizzando un nuovo ObjectOutputStream per scrivere su uno ObjectInputStream esistente a cui è già stato utilizzato un precedente ObjectOutputStream da scrivere. Questi stream hanno intestazioni che sono scritte e lette dai rispettivi costruttori, quindi se crei un altro ObjectOutputStream scriverai una nuova intestazione, che inizia con - indovina cosa? - 0xAC, e l'attuale ObjectInputStream non prevede un'altra intestazione a questo punto, quindi barfs.

Nel thread dei forum Java citato da @trashgod, avrei dovuto lasciare la parte di "nuovo per ogni oggetto alle due estremità": è solo uno spreco. Utilizzare un singolo OOS e OIS per la durata del socket e non utilizzare altri flussi sullo zoccolo.

Se si vuole dimenticare quello che hai scritto, utilizzare ObjectOutputStream.reset().

e non utilizzare altri corsi d'acqua o Readers o Writers sulla stessa presa. Le API del flusso di oggetti possono gestire tutti i tipi di dati primitivi Java e tutte le classi Serializable.

+1

+1 @rookie: questa è la risposta corretta, e dalla fonte originale! :-) – trashgod

+0

@EJP evrytime eseguo il codice, viene creato un nuovo OOS e OIS. come lo gestisco? –

+0

@AkhilKNambiar Non so cosa mi stai chiedendo che non abbia già risposto sopra. – EJP

-1

affrontato una simile eccezione durante l'utilizzo di Java 7/8, ho risolto aggiungendo il sotto argomento VM

-Dsun.lang.ClassLoader.allowArraySyntax=true 
+0

'Simile' non è lo stesso. Questo non risolve il problema postato dall'OP. – EJP

Problemi correlati