Serialização

16 respostas
A

Galéra segue a seguinte questão que encontrei em um simulado:

class Car implements Serializabel{} class Ford extends Car{}

Caso vc tente serializar uma instância de Ford qual será o resultado?
A) Ocorrerá erro de compilação.
B) Nenhum objeto será serializado.
C) Dois objetos serão serializados.
D) Uma exeção será lançada, em tempo de execução.

A resposta correta é a letra B.
A minha resposta foi a letra C.
A justificação do livro foi a segunte: A subclasse não tem que serializar se a superclasse o fizer.

Isso eu já sabia mas galerá vcs não acham que o livro ta errado na escolha da letra B? A resposta correta pra mim ainda seria a letra C.

Alguêm poderia me dar uma força?

Grato!

16 Respostas

G

Quando vocÊ serializa um objeto em java, você serializa na verdade os valores que os seus atributos de instância não marcados como transient tinham no momento da serialização, essa classe Car e Ford, embora indiquem ao compilador que podem ser serializadas, implementando a interface java.io.Serializable, não possuem nenhum atributos de instancia a ser persistido, por isso, a resposta B é correta.

S

A resposta correta deveria ser “um objeto é serializado” que não consta das opções.
Mesmo que o objeto não tenha estado ele será serializado. Afinal, serializar não escreve apenas os atributos mas tb o nome da classe. E todos os objetos têm um classe.

Faça a experiência com código. Crie essas classes e serialize o objeto. Não ha razão para não funcionar.

G

Eu entendi a questão no ponto de vista do que é o objetivo da serialização, que é manter o estado do objeto, quando você não tem um estado a ser mantido, você não tem um estado a ser recuperado.

G

sergiotaborda , quantos objetos foram serializados nesse exemplo, nenhum, a única coisa que foi serializadas são as meta informações da classe.l

R

eu vou com o sergio não tem nada a ver o que o gilberto falo !

R

neste exemplo significa que car é Serializable e ford extends Car, logo Ford é Serializable ! Então quando serializar um Objecto Ford somente um Objecto Será serializado !!!

R

When you serialize an instance of Cow, how many objects will be serialized?

import java.io.*;
 class Animal implements Serializable {}
class Cow extends Animal{
     Milk m = new Milk();
 }
 class Milk implements Serializable {
 SaturatedFat sf1 = new SaturatedFat();
 SaturatedFat sf2 = new SaturatedFat();
 SaturatedFat sf3 = new SaturatedFat();
}
class SaturatedFat implements Serializable { }

nesse codigo anderson ve se voce consegue saber quantos objectos serão serializados ???

T
import java.util.*;
import java.io.*;

class Car implements Serializable {
}
class Ford extends Car {
}

/**
 * A saída deste programa é:
Lido um objeto da classe Ford
Não há mais objetos para serem desserializados.
 * Isto indica que apenas um objeto foi serializado.
 */
class ObjetosSerializados {
    public static void main(String[] args) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream ("objeto.bin"));
        oos.writeObject (new Ford ());
        oos.close();
        ObjectInputStream ois = new ObjectInputStream (new FileInputStream ("objeto.bin"));
        Object obj;
        try {
            while ((obj = ois.readObject()) != null) {
                System.out.println ("Lido um objeto da classe " + obj.getClass().getName());
            }
        } catch (EOFException ex) {
            System.out.println ("Não há mais objetos para serem desserializados.");
        }
        ois.close();
    }
}
A

Raff:

When you serialize an instance of Cow, how many objects will be serialized?

import java.io.*;
 class Animal implements Serializable {}
class Cow extends Animal{
     Milk m = new Milk();
 }
 class Milk implements Serializable {
 SaturatedFat sf1 = new SaturatedFat();
 SaturatedFat sf2 = new SaturatedFat();
 SaturatedFat sf3 = new SaturatedFat();
}
class SaturatedFat implements Serializable { }

nesse codigo anderson ve se voce consegue saber quantos objectos serão serializados ???

Minha resposta foi 6. Primeiro é serializado Milk ai segue 3 instancias de SaturatedFat seguido pelo próprio COW e por fim Animal.

A
thingol:
import java.util.*;
import java.io.*;

class Car implements Serializable {
}
class Ford extends Car {
}

/**
 * A saída deste programa é:
Lido um objeto da classe Ford
Não há mais objetos para serem desserializados.
 * Isto indica que apenas um objeto foi serializado.
 */
class ObjetosSerializados {
    public static void main(String[] args) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream ("objeto.bin"));
        oos.writeObject (new Ford ());
        oos.close();
        ObjectInputStream ois = new ObjectInputStream (new FileInputStream ("objeto.bin"));
        Object obj;
        try {
            while ((obj = ois.readObject()) != null) {
                System.out.println ("Lido um objeto da classe " + obj.getClass().getName());
            }
        } catch (EOFException ex) {
            System.out.println ("Não há mais objetos para serem desserializados.");
        }
        ois.close();
    }
}

Thingol percebi que seu código gerou uma exceção e vc capiturou ela. Pq gerou essa exceção?

gilberto.souza:
sergiotaborda , quantos objetos foram serializados nesse exemplo, nenhum, a única coisa que foi serializadas são as meta informações da classe.l

Eu entendi o que vc falou, vc quiz dizer que não tem nenhuma variavel que foi serializada para depois ser recuperada.

gilberto.souza:
Quando vocÊ serializa um objeto em java, você serializa na verdade os valores que os seus atributos de instância não marcados como transient tinham no momento da serialização, essa classe Car e Ford, embora indiquem ao compilador que podem ser serializadas, implementando a interface java.io.Serializable, não possuem nenhum atributos de instancia a ser persistido, por isso, a resposta B é correta.

Gilberto pelo que eu entendi vc quiz dizer que será serializado nenhum valor que não seja marcado como transitiend que a classe pode ter, mas que será serializado uma instancia da classe Ford. Estou correto na conclusão que tirei?

Essá questão não é tão boba o quanto parece.

R

anderson na verdade são 5 objetos !!!

R

a Pergunta é a seguinte cara : quantos objectos serão serializados quando um objecto Cow será serializado.
Resposta : Quando você serializar um Object Cow, Cow implementa Serializable , Cow tbm tem - um Milk e Milk tbm é Serilizable, mas ainda a história continua pois Milk tem 3 instancia de SaturatedFat. Logo 5 objetos serão Serializable

A

Raff:
a Pergunta é a seguinte cara : quantos objectos serão serializados quando um objecto Cow será serializado.
Resposta : Quando você serializar um Object Cow, Cow implementa Serializable , Cow tbm tem - um Milk e Milk tbm é Serilizable, mas ainda a história continua pois Milk tem 3 instancia de SaturatedFat. Logo 5 objetos serão Serializable

É eu me esqueci que a classe animal neste caso não entra na serealização e que nenhuma informação da classe vai ser serializada. Diferentemente de Cow.

R

anderson conseguiu entender cara ?

A

Bem se minha ultima resposta colocada tiver certa então eu entendi.
:slight_smile:

S

gilberto.souza:
sergiotaborda , quantos objetos foram serializados nesse exemplo, nenhum, a única coisa que foi serializadas são as meta informações da classe.l

Errado. Se vc serializar dois objetos sem atributos da mesma classe as metainformações são incluidas no stream duas vezes. Vc está serializando o objeto, não a classe. Por isso que quando A extends B e serializa A , vc serializa apenas A e nunca não B. O exemplo do tingol demonstra exactamente isto.

não ha porque ter duvidas em serialização. Apenas faça uma serialização e veja o que acontece.

Criado 15 de janeiro de 2008
Ultima resposta 16 de jan. de 2008
Respostas 16
Participantes 5