Pregunta

¿Es posible ObjectOutputStream / ObjectInputStream una clase interna? Puedo escribirlo OK y examinar el archivo creado, pero cuando trato de leerlo nuevamente usando ObjectInputStream, obtengo una EOFException solo tratando de leer un Object o = oos.readObject ();

  1. Uso el mismo objeto File para abrir ambas secuencias, por lo que ese no es el problema.
  2. Parece ser independiente de la naturaleza de la Clase interna: una clase con solo un int público falla de manera idéntica a una clase más compleja.

Tengo que seguir adelante, crear una clase regular e instanciar en la clase de remitente, pero odio alejarme sin saber si es posible, y si no, por qué no.

Actualización: problemas relacionados que fueron la causa del problema:

A. No puede volver a abrir un archivo escrito con un ObjectOutputStream y agregarlo: se escribe un segundo encabezado y corrompe el archivo.

B. Serializar un HashMap usando ByteOutputStream para hacer un resumen de hash no funciona, porque cuando lees el HashMap de nuevo desde un archivo ObjectOutputStream, es muy posible que obtengas un byte diferente [] de ByteOutputStream debido a variaciones en el orden de los pares: el contenido es lo mismo, pero el byte [] (y por lo tanto el hash disgest) no lo es.

Espero que esto ayude a alguien a ahorrar algo de tiempo.

¿Fue útil?

Solución

Este me funciona. Busque cualquier diferencia en su solución.

public class Example implements Serializable {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        new Example().run();
    }

    private void run() throws IOException, ClassNotFoundException {
        Inner inner = new Inner();
        inner.x = 5;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream outputStream = new ObjectOutputStream( out );
        outputStream.writeObject( inner );

        ByteArrayInputStream in = new ByteArrayInputStream( out.toByteArray() );
        ObjectInputStream inputStream = new ObjectInputStream( in );
        Inner inner2 = (Inner) inputStream.readObject();

        System.out.println( inner2.x );
    }

    class Inner implements Serializable {
        int x;
    }
}

Otros consejos

¿Puede incluir un pequeño fragmento de código de muestra? La explicación más obvia es que no está cerrando / vaciando el flujo de salida antes de intentar volver a leerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top