2010-03-06 30 views
26

Mi problema es cuando se trata de leer el objeto del segundo tiempo, se produce la excepción:StreamCorruptedException: Código de tipo no válido: 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 primera vez que envío el mensaje exacto mismo objeto; sin embargo, cuando intento hacer lo mismo la segunda vez, arroja el error anterior. ¿Debo volver a inicializar el método readObject()? Incluso imprimí el objeto de mensaje que se está recibiendo en la línea siguiente y es exactamente igual a la primera instancia en que funciona bien.

Object buf = myInput.readObject(); 

Supongo que hay algún problema con la adición, pero realmente no tengo uso para anexar. Solo quiero leer una línea nueva cada vez. Realmente agradecería algo de ayuda para solucionar este error. Gracias.

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

Antes de que una línea, yo soy simplemente creando los objetos de entrada y salida para el socket en el método run(). La declaración del objeto está fuera del método run() en la clase: -

@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(); 
     } 
    } 
} 

Tiene razón; No cierro el objeto. No estoy seguro de cómo hacer eso.

+0

No estoy seguro de dónde cerrar el objeto –

+0

NB: Es preferible coger EOFException y no tratarla como un error: no inicie sesión ni imprima el seguimiento de la pila; solo deja que termine el ciclo de lectura. No sé por qué atrapas UnknownHostException donde estás: no se puede lanzar desde dentro del bloque try correspondiente. El sueño() es literalmente una pérdida de tiempo. Eliminarlo – EJP

Respuesta

54

El problema de fondo es que está utilizando un nuevo ObjectOutputStream escribir en un ObjectInputStream existente que ya ha utilizado un ObjectOutputStream antes de escribir a. Estas secuencias tienen encabezados que son escritos y leídos por los respectivos constructores, por lo que si crea otro ObjectOutputStream, escribirá un nuevo encabezado, que comienza con - ¿adivinen qué? - 0xAC, y el ObjectInputStream existente no espera otro encabezado en este punto, por lo que barfs.

En el hilo de los Foros de Java citado por @trashgod, debería haber omitido la parte sobre 'de nuevo para cada objeto en ambos extremos': eso es un desperdicio. Utilice un único OOS y OIS durante la vida útil del zócalo, y no use ninguna otra transmisión en el zócalo.

Si desea olvidar lo que has escrito, utilice ObjectOutputStream.reset().

y no utilice ningún otro arroyos o Readers o Writers en el mismo socket. Las API de flujo de objetos pueden manejar todos los tipos de datos primitivos de Java y todas las clases Serializable.

+1

+1 @rookie: ¡Esta es la respuesta correcta, y de la fuente original! :-) – trashgod

+0

@EJP evrytime ejecuto el código, se crea un OOS y OIS nuevos. ¿Cómo manejo eso? –

+0

@AkhilKNambiar No sé lo que me estás preguntando que no haya sido respondido anteriormente. – EJP

-1

se enfrentó a una excepción similar, mientras que el uso de Java 7/8, lo solucioné añadiendo el siguiente argumento de VM

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

'Similar' no es lo mismo. Esto no resuelve el problema publicado por el OP. – EJP

Cuestiones relacionadas