Problema ao salvar um ArrayList em arquivo

2 respostas
javaprogramação
C
Galera, teoricamente o meu programa consegue salvar em arquivo, porém quando mando carregar esses dados apresenta o seguinte erro: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lmodel.Cliente;

O meu código é esse (vou tirar algumas partes que não tem a ver com isso).

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import model.Cliente;

public class ClienteRepository {

protected  List<Cliente> clientes;

public ClienteRepository(){
    clientes = new ArrayList<>();
}
public void persistAll(){

try{

FileOutputStream arquivoOut = new FileOutputStream(clientesLista.dat);

ObjectOutputStream out = new ObjectOutputStream(arquivoOut);

out.writeObject(clientes.toArray());

System.out.println(Clientes Salvos.);

}

catch(IOException e){

System.out.println(Falha ao Salvar.);

}

}
public void loadAll(){
    try{
        FileInputStream arquivoIn = new FileInputStream("clientesLista.dat");
        ObjectInputStream in = new ObjectInputStream(arquivoIn);
        Cliente[] loader = (Cliente[])in.readObject();
        clientes.addAll(Arrays.asList(loader));
    }
    catch(Exception ex){
        System.out.println("Erro ao gravar.");
        System.out.println(ex);
    }
}

}

Ah, eu ja fiz a implementação da interface Serializable na minha classe Cliente.

2 Respostas

staroski

No seu método persistAll(), quando você faz out.writeObject(clientes.toArray()) o clientes.toArray() retorna um Object[] e não um Cliente[].

Como você está granavado um Object[], acontece ClassCastException quando você vai tentar ler com Cliente[] loader = (Cliente[]) in.readObject().

Para fazer o toArray retornar um Cliente[], você precisa passar um Cliente[] como parâmetro, assim:

public void persistAll(){
    try{
        FileOutputStream arquivoOut = new FileOutputStream("clientesLista.dat");
        ObjectOutputStream out = new ObjectOutputStream(arquivoOut);
        out.writeObject( clientes.toArray(new Cliente[clientes.size()])) );
        System.out.println("Clientes Salvos.");
    } catch(IOException e){
        System.out.println("Falha ao Salvar.");
    }
}
C

Cara eu já consegui resolver aqui, mas era exatamente isso que você falou, fiz as alterações e funcionou perfeitamente.
Agradeço pela explicação, tmj

Criado 21 de outubro de 2020
Ultima resposta 21 de out. de 2020
Respostas 2
Participantes 2