Dúvida <=> Serialização

2 respostas
deyvid

Em um determinado livro lemos: "Um construtor ou qualquer inicialização não são chamados durante
a desserialização do objeto. Os campos transient são associados a valores padrão para cada tipo de dado"

O seguinte código imprime "catName" duas vezes. Mas "Um construtor ou qualquer inicialização não são chamados durante
a desserialização do objeto".

Alguem pode elucidar esse problema de inicialização de um objeto serializado?

import java.io.*;

class Cat implements Serializable {
	private String catName = "catName"; //<----------- INICIALIZAÇÃO
	public String toString() { return catName;}
}

public class Teste {
	public static void main(String[] args) {
		Cat cat1 = new Cat();
		
		System.out.println("cat..: " + cat1); //<----------- IMPRIME "catName"
		
		try {
			FileOutputStream fo = new FileOutputStream("teste.do");
			ObjectOutputStream os = new ObjectOutputStream(fo);
			os.writeObject(cat1);
			os.close();
			
			FileInputStream fi = new FileInputStream("teste.do");
			ObjectInputStream oi = new ObjectInputStream(fi);
			Cat cat2 = (Cat) oi.readObject();
			
			System.out.println("cat..: " + cat2); //<----------- IMPRIME "catName"
			
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

2 Respostas

F

O que acontece é quando o objeto é serializado ele serializa também o seu atributo catName.

Explicando, quando ele cria o objeto e imprime ele, a class Cat sobrescreve o método toString que imprime a variável catName com o conteúdo “catName”. Quando vc deserializa o objeto é recuperado com os mesmos dados com que foram gravados, por isso quando vc imprime o objeto cat2 ele imprime “catName”, também.

Dica: tente alterar o valor da variável catName antes da seriailzação para ver o que acontece…

diegohsi

O que acontece felipe.sales é que quando vc serializa um objeto ele guarda seus valores no seu arquivo, até ai tudo bem. Agora quando vc des-serializa o objeto o contrutor não será chamado pois o que irá acontecer no lugar do contrutor é a leitura dos valores que estão no arquivo e colocados nas variáveis da classe. Agora referente a variaveis transient o que ocorre é o seguinte. Elas não são serializadas junto com as outras variáveis não transient, por isso quando vc des-serializar um objeto as variaveis transient sempre retornarão com o valor padrão (null/0). Tente fazer um exemplo colocando no contrutor de uma classe e depois imprima seu valor. Perdoe-me se estou errado.

private int v1 = 0; transient int v2; public Construtor() { v2 = 7; }

Criado 30 de novembro de 2010
Ultima resposta 1 de dez. de 2010
Respostas 2
Participantes 3