Ajuda - Serialização

4 respostas
Marcosta

Bom, me falaram para estudar isso de serialização Mas não entendi muito bem.

Alguém pode me explicar o que está havendo.

public class Teste {
	public static void main(String[] args) {
		Leao leao = new Leao(120, "Juba");
	    System.out.println("antes de deserializar: " + leao.nome + " " + leao.tamanho);
		try {
			FileOutputStream fos = new FileOutputStream("arquivo.txt");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(leao); 
			oos.close();
		}catch (Exception ex){ 
			ex.printStackTrace();
		}
		try {
			FileInputStream fis = new FileInputStream("arquivo.txt");
			ObjectInputStream ois = new ObjectInputStream (fis);
			leao = (Leao) ois.readObject(); ois.close();
		}catch (Exception ex){ 
			ex.printStackTrace();
		}
		 System.out.println("depois de deserializar: " + leao.nome + " " + leao.tamanho);
	}
}

public class Leao extends Animal implements Serializable {
	private static final long serialVersionUID = 1L;
	String nome;
	public Leao(int t, String n) {
		tamanho = t;
		nome = n;
	}
}

public class Animal {
	int tamanho = 105;
}

Parece que ele está colocando o objeto em um arquivo, ou alterando ele através de um arquivo, não entendi direito.

Desde já agradeço.

4 Respostas

matheuslmota

Serializar é o ato de salvar o estado de um objeto para que seus atributos possam ser recuperados posteriormente. Eu dei uma comentada no seu código para clarear mais:

public class Teste {
	public static void main(String[] args) {
		Leao leao = new Leao(120, "Juba");
	    System.out.println("antes de deserializar: " + leao.nome + " " + leao.tamanho);
		try {
			FileOutputStream fos = new FileOutputStream("arquivo.txt"); //Aqui é criada uma stream para escrita de dados no arquivo
			ObjectOutputStream oos = new ObjectOutputStream(fos); // Nesse ponto, é criada uma stream para escrita de objetos.
			oos.writeObject(leao); //Escreve, de fato, o objeto. Observe atentamente que o objeto Leao é escrito em oos e oos escreve esse objeto em fos, que o salva em um arquivo.
			oos.close();
		}catch (Exception ex){ 
			ex.printStackTrace();
		}
		try {
			FileInputStream fis = new FileInputStream("arquivo.txt"); // Cria uma stream para leitura do arquivo que contém o objeto
			ObjectInputStream ois = new ObjectInputStream (fis); //Cria uma stream para leitura de objetos a partrir e fis
			leao = (Leao) ois.readObject(); //Lê o objeto. Obseve que esse método readObject lê o objeto que existe em ois e retorna um Object. Por tanto, sempre faça um cast ao chamar esse método.
			ois.close();
		}catch (Exception ex){ 
			ex.printStackTrace();
		}
		 System.out.println("depois de deserializar: " + leao.nome + " " + leao.tamanho); // Aqui são mostradas as informações do objeto que foi recuperado à partir
	}
}

public class Leao extends Animal implements Serializable {
	private static final long serialVersionUID = 1L;
	String nome;
	public Leao(int t, String n) {
		tamanho = t;
		nome = n;
	}
}

public class Animal {
	int tamanho = 105;
}

A classe que você deseja serializar deve obrigatoriamente implementar a interface Serializable.

Marcosta

Clareou bastante, só fiquei com uma duvida.
Se é savlo o estado do objeto, porque o atributo tamanho mudou seu estado após a serialização.

Antes ele erá 120 (parametro do construtor) e depois ele se tornou 105 (o mesmo estado do atributo na superclasse).

Mas sua explicação clareou muito.
Vlw

matheuslmota

Marcosta:
Clareou bastante, só fiquei com uma duvida.
Se é savlo o estado do objeto, porque o atributo tamanho mudou seu estado após a serialização.

Antes ele erá 120 (parametro do construtor) e depois ele se tornou 105 (o mesmo estado do atributo na superclasse).

Mas sua explicação clareou muito.
Vlw

public class Leao extends Animal implements Serializable { private static final long serialVersionUID = 1L; String nome; public Leao(int t, String n) { super.tamanho = t; nome = n; } }

No construtor da classe Leao, ao invés de usar

tamanho = t;

Use

super.tamanho = t;

Da forma que você fez, você estava pegando uma cópia do parâmetro tamanho, ou seja quando você alterou o valo do atributo tamanho pra 120, você estava alterando o valo da cópia desse atributo. Quando você leu o objeto a partir do arquivo, como o valor do atributo não foi salvo, o objeto recebeu o valor padrão para o atributo tamanho, ou seja, 105.

Sempre que você quiser acessa um atributo da classe pai, que é a classe que você está estendendo, use a seguinte sintaxe:

super.parametro;
Marcosta

Opa, vlw. Duvida Sanada.

Criado 3 de setembro de 2011
Ultima resposta 4 de set. de 2011
Respostas 4
Participantes 2