Java: StreamCorruptedException on serialization / deserialization of objects

1

I'm doing an exercise involving serialization and deserialization in Java. In the program execution 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 have 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 creating a second instance of ObjectOutputStream. However, I have already tried to create only one instance of ObjectOutputStream with each program execution, and even then there is the same error.

Follow the program that is giving you a problem.

Class TestSerializer (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;
    }
}

Product Manager class:

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 replace the main () method in the TestSerializer class with

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 throw the exception in the second execution (on the first wheel normally).

    
asked by anonymous 08.09.2018 / 22:26

0 answers