Domanda

È possibile ObjectOutputStream / ObjectInputStream una classe interna? Posso scriverlo bene ed esaminare il file creato, ma quando provo a rileggerlo usando ObjectInputStream, ottengo una EOFException solo provando a leggere un oggetto o = oos.readObject ();

  1. Uso lo stesso oggetto File per aprire entrambi i flussi, quindi non è questo il problema.
  2. Sembra essere indipendente dalla natura della Classe interna - una classe con solo un int pubblico fallisce in modo identico a una classe più complessa.

Devo andare avanti, creare una classe regolare e creare un'istanza nella classe mittente, ma odio andarmene senza sapere se è possibile, e se no perché no.

Aggiornamento: problemi correlati che sono stati la causa del problema:

A. Non è possibile riaprire un file scritto con ObjectOutputStream e aggiungere: una seconda intestazione è scritta e corrompe il file.

B. La serializzazione di una HashMap utilizzando ByteOutputStream per eseguire un digest hash non funziona, perché quando leggi di nuovo HashMap da un file ObjectOutputStream, potresti benissimo ottenere un byte diverso [] da ByteOutputStream a causa delle variazioni nell'ordine delle coppie: il contenuto è lo stesso, ma il byte [] (e quindi l'hash disgest) non lo è.

Spero che questo aiuti qualcuno a risparmiare un po 'di tempo.

È stato utile?

Soluzione

Questo funziona per me. Cerca eventuali differenze nella tua soluzione.

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;
    }
}

Altri suggerimenti

Puoi includere un po 'di codice di esempio? La spiegazione più ovvia è che non stai chiudendo / svuotando il flusso di output prima di provare a rileggerlo nuovamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top