Serializable

8 respostas
D

Depois da ajuda que me deram ao resolver um problema com o ArrayList, apenas me falta resolver uma situação para o programa que estou a criar ficar concluido.

Relembrando o codigo que tenho:

--------- Class Colaboradores -------------
public class colaborador extends pessoa implements java.io.Serializable {
int numcolaborador;
colaborador(){}
public colaborador(String nome,String morada,String cidade,int codigop,String tele,String dep, String cargo, Date hi,Date ho,int n){
     Nome = nome;
     Morada = morada;
     CodigoPostal = codigop;
     Cidade = cidade;
     Telefone = tele;
     ++numcolaborador;
    }
    @Override
public String toString(){
return ("\nNumero Colaborador: "+numcolaborador+"\nNome: "+Nome+"\nMorada: "+Morada+"\nCidade: "+Cidade+"\nDepartamento: "+Departamento+"\nCargo: "+Cargo+ "\n");
}
}

-------- Programa Principal --------------
Onde chamo as diferentes classes e metodos criados (tanto no programa principal como nas classes)

public final class ProgramaPrincipal {
   public colaborador colab = new colaborador();
   public ArrayList<colaborador> colaborador = new ArrayList<colaborador>();
  
// - - - - - - -  Inserir Colaborador - - - - - -
    public void inserircol(){
    int i;
    colaborador colab = new colaborador();
    colab.numcolaborador = colaborador.size() + 1;
    colab.setNome(pessoa.inputNome("Insira o nome"));
    colab.setMorada(pessoa.inputMorada("Insira a Morada"));
    colab.setCodigoPostal(pessoa.inputCodigop("Insira o codigo postal"));
    colab.setCidade(pessoa.inputCidade("Insira a cidade"));
    colab.setTelefone(pessoa.inputTelefone("Insira o número de telefone"));
    colaborador.add(colab);

(..........)

    }

O que pretendo é :
1.- Apos a função INSERIR, quero gravar para ficheiro. Para isso queria criar uma nova função no PROGRAMA PRINCIPAL que depois seria chamada quando são inseridos / removidos e alterados os colaboradores.

2.- Ao iniciar o programa, ler a informação dos ficheiros.

Vou ser sincero, apesar de já ter pesquisado bastanto sobre ?Serializable? continuo sem perceber como implementar no meu codigo.

O que tenho criado ate ao momento é o seguinte:

// - - - - - - -  Gravar para Ficheiro - - - - - -
    public void Serialcol() {
        try {
            //Serializando o objeto no arquivo "objSerializado.obj"
FileOutputStream out = new FileOutputStream("Colaboradores.obj");
            ObjectOutputStream oo = new ObjectOutputStream(out);
            oo.writeObject(colab); //Escrevendo objeto no arquivo!
            JOptionPane.showMessageDialog (null, "Registo Gravado");
        } catch (Exception e) {
            e.printStackTrace();
        }
}

Estou a utilizar bem o Serializable ?? não me parece !

E para ler de ficheiro?

Isto não funciona. Mas ando la perto ou nem por isso??

// - - - - - - -  Ler de Ficheiro - - - - - -
    public void lercol(){
        try {
            FileInputStream in = new FileInputStream("Colaboradores.obj");
            ObjectInputStream oi = new ObjectInputStream(in);
            colaborador colab = (colaborador) oi.readObject();

        }catch (Exception e) {
            e.printStackTrace();
        }
   }

Se me conseguirem ajudar, agradeço!
Obrigado!

8 Respostas

Marky.Vasconcelos

Qual Exception é lançada?

Não acha melhor usar um banco de dados?

D

Mark_Ameba:
Qual Exception é lançada?

Não acha melhor usar um banco de dados?

Não me é lançada nehuma Exception… mas se consultar os registo que tenho confirmo que não foi inserido nada apos a leitura do ficheiro.

Em relação ao usar banco de dados? Era suposto ser simples. Acham que compensa? é mais facil?
Também não conheço o metodo de implementação.

Marky.Vasconcelos

Acho que aprender a usar o Banco de Dados interessante, mesmo sendo simples voce vai aprender algo que voce vai precisar.

E pra não ter que fazer um servidor voce pode usar um bando de dados OO como o NeoDatis ou um imbutido como o HSQLDB.

C

Você pode salvar e ler objetos serializados com o seguinte:

public static void salva() throws IOException {
		FileOutputStream fos = new FileOutputStream("colaboradores.txt");

		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(colaboradores);
		oos.close();

	}

	public static ArrayList<Colaborador> le() throws IOException, ClassNotFoundException {
		FileInputStream fis = new FileInputStream("colaboradores.txt");

		ObjectInputStream ois = new ObjectInputStream(fis);
		ArrayList<Colaborador> colabs = (ArrayList<Colaborador>) ois.readObject();
		ois.close();
		return colabs;
	}

Que ficará em sua classe principal.
Se você não implemetnar Serializable em todas a sclasses será lançada uma java.io.NotSerializableException
Isso quer dizer que: Colaboradores extends de Pessoa, então Pessoa também tem que implementar Serializable.

D

Ok, estou a perceber!
Quando faço inserir Colaborador eles estão a ser gravados para ficheiro correctamente.

Mas ao sair da aplicação, quando volto a entrar a informação não volta a ser colocada no Array.

ou seja, se fizer um colaborador.toString() para consultar não existe nada.

Outra questão é quando ele corre a função “gravar” novamente, grava por cima dos dados antigos.

Marky.Vasconcelos
public static void salva() throws IOException {
		FileOutputStream fos = new FileOutputStream("colaboradores.txt");

		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(colaboradores);
		oos.close();
                                fos.close();

	}

	public static ArrayList<Colaborador> le() throws IOException, ClassNotFoundException {
		FileInputStream fis = new FileInputStream("colaboradores.txt");

		ObjectInputStream ois = new ObjectInputStream(fis);
		List<Colaborador> colabs = (List<Colaborador>) ois.readObject();
		ois.close();
                                fis.close();
		return colabs;
	}
D

Parece que é isso mesmo... mas agora uma ultima questão:

Ao criar as funções SALVAR e LER com "throws IOException", tenho que colocar throws IOException em todas as funções onde chamo Salvar(); e Ler();, Correcto?
Mas se tiver um numa outra class, quando chamo uma função com throws IOException não é possivel.

Ou seja:

public void inserircol()throws IOException, ClassNotFoundException{
salvar();
}

----Outra class ----

class xpto implements ActionListener {
   public void actionPerformed(ActionEvent e){
        classe.inserircol();  // Erro
   }
}

Não é possivel colcar throws IOException num ActionListener... como faço?

Marky.Vasconcelos

Se voce lança a exceção em salvar alguem tem que pega-la(try/catch) e na ação do ActionListener voce deve trata-la.

Criado 26 de janeiro de 2010
Ultima resposta 27 de jan. de 2010
Respostas 8
Participantes 3