Marcar classes para serializar com Serializable é obrigatório ou não?

9 respostas
S

Olá pessoal,
No cap. 6 do livro da kathy para a certificação 5 diz que se tentar serializar uma classe (ou se essa classe tiver uma variavel de instancia pra outra classe) que não está implementando Serializable receberá a exceção: java.io.NotSerializableException.
Porém criei duas classes, sendo que nem uma esta implementando Serializable, e onde uma classe tem uma variavel de instancia da outra e consegui serializar e desserializar sem problemas, num dá erro algum, quanto menos a exceção. Diante disso fiquei na dúvida, é obrigatório ou não marcar com Serializable?

Obs: Estou usando o compilador 6, porém compilei com a opção -source 5…

9 Respostas

M

Se quizer serializar, tem que implementar Serializable, seja a propria classe ou a classe mãe!

Se vc puder mostrar seu codigo nós podemos te ajudar.

S

Olá m4, tbm pensei que deveria ser assim.

meu código:

class Dog {
    private Collar colar;
    private int size;

    public Dog(Collar c, int s){
        colar = c;
        size = s;
    }

    public Collar getColar(){
        return this.colar;
    }
}


class Collar{
   private int size;

   public Collar(int s){
       size = s;
   }

   public int getSize(){
       return this.size;
   }
}

import java.io.*;

public class SerializaDog {

    public static void main(String[] s){

        Collar c = new Collar(3);
        Dog d = new Dog(c,9);

        System.out.println(d.getColar().getSize());

        try{
           FileOutputStream fos = new FileOutputStream("serdog");
           ObjectOutputStream oos = new ObjectOutputStream(fos);
           oos.writeObject(d);
           oos.close();
        }catch(FileNotFoundException e){
        }catch(IOException e){}

        try{
           FileInputStream fis = new FileInputStream("serdog");
           ObjectInputStream ois = new ObjectInputStream(fis);
           d = (Dog) ois.readObject();
           ois.close();
        }catch(FileNotFoundException e){
        }catch(IOException e){
        }catch(ClassNotFoundException e){}

        System.out.println(d.getColar().getSize());
    }
}

Esse código roda,cria o arquivo "serdog" e exibe:
3
3

O que axa?

B

Para serializar objetos é obrigatório que eles implementem a interface Serializable se você não o fizer terá uma exceção em tempo de execução(NotSerializableException).Por padrão qualquer objeto estende da classe Object que não implementa Serializable por isso é necessário implementar a interface.

Jairo_Junior1

Vou te dizer onde está o problema, aqui ó:

}catch(FileNotFoundException e){
}catch(IOException e){}

Faltou o e.printStackTrace() pra te mostrar que exceção o código lançou e perceber que na verdade não estava serializando coisa nenhuma.

E ele exibe o mesmo resultado, simplesmente porque o que acontece é isso aqui:

System.out.println(d.getColar().getSize());

//um monte de código que não vai dá certo porque a classe não implementa Serializable

System.out.println(d.getColar().getSize());

Ou seja, imprime as informações do mesmo objeto d, pois não aconteceu nada desde a sua criação, se você adicionasse um novo objeto Dog entre os blocos trycatch, também veria que não funcionou.

M

java.lang.JJunior:
Vou te dizer onde está o problema, aqui ó:

}catch(FileNotFoundException e){
}catch(IOException e){}

Faltou o e.printStackTrace() pra te mostrar que exceção o código lançou e perceber que na verdade não estava serializando coisa nenhuma.

E ele exibe o mesmo resultado, simplesmente porque o que acontece é isso aqui:

System.out.println(d.getColar().getSize());

//um monte de código que não vai dá certo porque a classe não implementa Serializable

System.out.println(d.getColar().getSize());

Ou seja, imprime as informações do mesmo objeto d, pois não aconteceu nada desde a sua criação, se você adicionasse um novo objeto Dog entre os blocos trycatch, também veria que não funcionou.

PERFECT!!!

E agora eu me pergunto…
quando vou chegar nesse nivel e tentar a certificação? :cry:

S

Valew!! java.lang.JJunior, matou a charada… e aprendi que nunca se deve deixar de colocar o rastreamento da pilha e talvez ganhei uma pergunta do exame…

Valew pela ajuda.

Jairo_Junior1

subgiu:
Valew!! java.lang.JJunior, matou a charada… e aprendi que nunca se deve deixar de colocar o rastreamento da pilha e talvez ganhei uma pergunta do exame…

Valew pela ajuda.

Nada, o importante é você acreditar na Kathy, SEMPRE. hahahaha

S

[/quote]Nada, o importante é você acreditar na Kathy, SEMPRE. hahahaha[/quote]

Ehh, claro… por isso que postei essa pergunta, pois o código não estava se comportando de acordo com o que ela disse, e isso é muuuito ruim… heheh

Acredito que para ser um bom scjp não basta acreditar na Kathy e ficar com dúvidas, e era o que tinha acontecido comigo… Vlw

Jairo_Junior1

Ehh, claro… por isso que postei essa pergunta, pois o código não estava se comportando de acordo com o que ela disse, e isso é muuuito ruim… heheh

Acredito que para ser um bom scjp não basta acreditar na Kathy e ficar com dúvidas, e era o que tinha acontecido comigo… Vlw
Sim, o problema é que você tentou criar um código para provar que tava errado e não o contrário, mais ou menos por aí ;D

Criado 17 de agosto de 2009
Ultima resposta 19 de ago. de 2009
Respostas 9
Participantes 4