Java: Streamcorruptedexception in object serialization/deserialization

Asked

Viewed 111 times

1

I’m conducting an exercise involving serialization and deserialization in Java. When running the program I am getting the following error in the IDE console (Netbeans):

set 08, 2018 5:07:53 PM testeserializador.Serializador desserializar
Nome: sabão em pó
GRAVE: null
Valor: 10.44
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1381)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
at testeserializador.Serializador.desserializar(Serializador.java:66)
at testeserializador.TesteSerializador.main2(TesteSerializador.java:22)
at testeserializador.TesteSerializador.main(TesteSerializador.java:9)

I’ve researched other similar questions, but everything I found involved the use of Internet connection, sockets and the like, and my program is much simpler than that. Other sources said that the problem was in the creation of a second instance of Objectoutputstream. Only I have tried to create only one instance of Objectoutputstream with each execution of the program and even then this same error occurs.

Follow the program that is giving problem.

Testeserializer class (containing main method):

public class TesteSerializador {

    public static void main(String[] args) {
        main1();
        main1(); ///Se apagar o "dados.dat" e retirar essa linha o programa funciona sem erros
        main2();
    }

    public static void main1(){
        GerenciadorProduto gProd = new GerenciadorProduto();
        gProd.produtoConstruir("sabão em pó", 10.44);
        Serializador ser = new Serializador(gProd);
        ser.serializar();
    }

    public static void main2(){
        GerenciadorProduto gProd = new GerenciadorProduto();
        Serializador ser = new Serializador(gProd);
        ser.desserializar();  
        gProd.produtosExibir();
    }
}

Serializer Class:

public class Serializador {
    FileOutputStream fos;
    ObjectOutputStream oos;
    FileInputStream fis;
    ObjectInputStream ois;

    GerenciadorProduto gProd;

    Produto produto;

    public Serializador(GerenciadorProduto gProd) {
        this.gProd = gProd;

        try{
            fos = new FileOutputStream("dados.dat", true);

            fos.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Serializador.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Serializador.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void serializar(){
        try {
            fos = new FileOutputStream("dados.dat", true);
            oos = new ObjectOutputStream(fos);

            for(Produto produtoIt : gProd.produtos){
                oos.writeObject(produtoIt);
            }

            oos.close();
            fos.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Serializador.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Serializador.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void desserializar(){
        try {
            fis = new FileInputStream("dados.dat");
            ois = new ObjectInputStream(fis);


            while(true){
                produto = (Produto) ois.readObject(); //é na segunda leitura que a exceção é lançada

                if(produto != null){
                    gProd.produtoAdicionar(produto);
                }else{
                    break;
                }
            }

            ois.close();
            fis.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Serializador.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            if(ex instanceof EOFException){
                System.out.println("Fim do arquivo!");

                return;
            }

            Logger.getLogger(Serializador.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Serializador.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Product class:

public class Produto implements Serializable{
    String nome;
    double valor;

    public Produto(String nome, double valor) {
        this.nome = nome;
        this.valor = valor;
    }
}

Managed Class Product:

public class GerenciadorProduto {
    List<Produto> produtos = new ArrayList();

    public void produtoConstruir(String nome, double valor){
        produtos.add(new Produto(nome, valor));
    }
    public void produtoAdicionar(Produto produto){
        produtos.add(produto);
    }
    public void produtosExibir(){
        for(Produto produto : produtos){
            System.out.println();
            System.out.println("Nome: "+produto.nome);
            System.out.println("Valor: "+produto.valor);
        }
    }
}

To clarify, if I delete "data.dat" (to "start from scratch") and refine the main() method in the Testeserializer class by

public static void main(String[] args) {
    main1();
    //main1(); ///Se apagar o "dados.dat" e retirar essa linha o programa funciona sem erros
    main2();
}

The program will launch the exception on the second run (on the first wheel normally).

  • Have you tried debugging this code line by line? Because debugging, no errors occur and the code runs normally.

  • Serialization doesn’t work like that. You need to know beforehand how many objects to serialize in your list and deserialize exactly that amount. That’s why using serialization has its limitations.

  • https://stackoverflow.com/a/2395269/5524514

  • @Piovezan Referencing the topic https://stackoverflow.com/questions/24825958/java-serialization-eofexception-issue the user user207421 replies that it is okay to use Eofexception to know that it has reached the end of the file and that it is not possible to read more objects. That’s what I’d like to do instead of having to know beforehand the amount of objects.

  • in the proper link q vc cite has a supposed solution, already tested?

  • @Article Yes, I have already run line by line with debugger. Netbeans, in this case. Showed the same error in console.

Show 1 more comment
No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.