Para que um objeto de uma classe seja serializável, ela precisa implementar a interface
Serializable. Quando um objeto é serializado, todas as suas variáveis de instância são serializadas também, inclusive variáveis que se referem a outros objetos. No entanto, se algumas das variáveis de instância de um objeto serializável não é ela mesma serializável, então ocorrerá um erro em tempo de execução ao tentar serializar o objeto. Uma instância da classe abaixo provocaria este erro ao ser serializado.
public class Animal implements Serializable{
public X peso;
public int idade;
}
public class X{int peso}
Este erro pode ser contornado marcando-se a variável de instância peso como
transient:
public transient X peso;
Neste caso, no entanto, a variável de instância peso não será serializada quando um objeto do tipo Animal for serializado. Variáveis transient recebem o valor default quando um objeto é deserializado. A variável peso de um objeto Animal receberia o valor default null num processo de deserialização.
Vejamos agora a situação em que a classe serializável tem como superclasse uma outra não-serializável:
public class Animal{public int peso=10;}
public class Gato extends Animal implements Serializable{
public int idade;
}
Imagine agora que criamos um objeto g do tipo Gato e fazemos g.peso=12; Em seguida, serializamos o objeto. Ao ser deserializado, a variável g.peso valerá 10 e não 12. Quando um objeto serializável tem uma superclasse não-serializável, o construtor dessa classe é chamado e as suas variáveis de instância são inicializadas normalmente.