Comparando serialização “é-um (herança)” com serialização “tem-um (composição)” com classes que não implementam interface Serializable.

Ao fazer os testes contidos no capítulo 6 do livro da Kathy Sierra e Bert Bates, pude perceber que estava com um pequeno lapso no meu conhecimento a respeito de serialização de objetos no Java.

A serialização de objetos no Java ocorre de maneira diferente quando o objeto serializado estende ‘é um’ um objeto não serializável ou quando ele se compõe ‘tem um’ de um objeto não serializável.

Abaixo será demonstrado que, no caso de herança, a superclasse não serializável irá executar o seu construtor quando sua sub-classe (que implementa a interface Serializable) for serializada. Também será demonstrado que, no caso de composição, a classe não serializável que compõe uma outra classe serializável causará uma exceção ao passar pelo processo de desserialização.

 

Este post se baseia nas questões 2, 4 e 12 do capítulo 6 do livro SCJP – Kathy Sierra e Bert Bates.

 

Q2 (serialização “é um” – herança):

 
 

Resposta à questão: pcp

Justificativa do livro: It’s okay for a class to implement Serializable even if its superclass doesn’t. However, when you deserialize such an object, the non-serializable superclass must run its constructor. Remember, constructors don’t run on deserialized classes that implement Serializable.

 
 

Q4 (Serialização “tem um” – composição):

 
 

Resposta à questão: exc

Justificativa do livro: An instance of type Computer Has-a Keyboard. Because Keyboard doesn’t implement Serializable, any attempt to serialize an instance of Computer will cause an exception to be thrown.

 
 

Exemplo relativo a Q2 (B é um A):

 
 

import java.io.Serializable;

import java.io.FileOutputStream;

import java.io.ObjectOutputStream;

import java.io.FileInputStream;

import java.io.ObjectInputStream;

 
 

public class Serial1 {

public static void main(String[] args){

try {

System.out.println(“*** instanciando B”);

B b1 = new B();

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“b.obj”));

oos.writeObject(b1);

 
 

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“b.obj”));

System.out.println(“*** desserializando B”);

B b2 = (B) ois.readObject();

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

 
 

}

}

 
 

class A {

{System.out.println(“A annonymous”);}

A(){System.out.println(“A construct”);}

}

 
 

class B extends A implements Serializable{

{System.out.println(“B annonymous”);}

B(){System.out.println(“B construct”);}

}

Output:

*** instanciando B

A annonymous

A construct

B annonymous

B construct

*** desserializando B

A annonymous

A construct

 
 

Exemplo relativo a Q4 (B tem um A):

 
 

import java.io.Serializable;

import java.io.FileOutputStream;

import java.io.ObjectOutputStream;

import java.io.FileInputStream;

import java.io.ObjectInputStream;

 
 

public class Serial2 {

public static void main(String[] args){

try {

System.out.println(“*** instanciando B”);

B b1 = new B();

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“b.obj”));

oos.writeObject(b1);

 
 

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“b.obj”));

System.out.println(“*** desserializando B”);

B b2 = (B) ois.readObject();

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

 
 

}

}

 
 

class A {

{System.out.println(“A annonymous”);}

A(){System.out.println(“A construct”);}

}

 
 

class B implements Serializable{

{System.out.println(“B annonymous”);}

B(){System.out.println(“B construct”);}

private A a = new A();

}

Output:

*** instanciando B

B annonymous

A annonymous

A construct

B construct

java.io.NotSerializableException: A

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1173)

at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1526)

at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1491)

at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1409)

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167)

at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:343)

at Serial2.main(Serial2.java:13)

 
 

Q12 (esta questão ratifica a constatação acima):

 
 

Resposta à questão: Serializaveis são: Car e Ford

Justificativa do livro: Dodge instances cannot be serialized because they “have” an instance of Wheels, which is not serializable. Vehicle instances cannot be serialized even though the subclass Car can be.

 
 

Esta entrada foi publicada em java.io com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s