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).