to dando um gás para fazer a certificação e qestou com algumas dúvidas relacionadas a Serializable e Assertions
[list]Serializable[/list]
Eu li no livro da Katy Sierra (SCJO 5.0 e USE A CABEÇA) que caso um objeto implemente a interface Serializable todas as suas variáveis de instâncias serão “automaticamente” serializadas também.
Mas caso umas das minhas variáveis seja um objeto de outra classe (i.e. A HAS-A B) e supomos que B não implemente a interface Serializable vai gerar um exception (NotSerializableException). A dúvida vem agora: “Porque então ela menciona que vai serializar automaticamente ??”
Eu tava estudando errado a parte de serialização, até que eu implementei e vi que não pode se a classe B também não implementar.
Essa parte automatizar que tinha me dexado confuso.
[list]Assertions[/list]
Eu vi que asserções não podem ser usadas nem para validar argumentos de métodos públicos ou entrada de dados de console.
Mas se caso eu implementar asserção com método público o programa compila normalmente.
Então porque é proibido ??
to dando um gás para fazer a certificação e qestou com algumas dúvidas relacionadas a Serializable e Assertions
[list]Serializable[/list]
Eu li no livro da Katy Sierra (SCJO 5.0 e USE A CABEÇA) que caso um objeto implemente a interface Serializable todas as suas variáveis de instâncias serão “automaticamente” serializadas também.
Mas caso umas das minhas variáveis seja um objeto de outra classe (i.e. A HAS-A B) e supomos que B não implemente a interface Serializable vai gerar um exception (NotSerializableException). A dúvida vem agora: “Porque então ela menciona que vai serializar automaticamente ??”
Ricardo
[/quote]
Então, também estou estudando para certificação é já passei o tópico de serialização…tb tive dificuldade, mais resumi para mim da seguinte forma:
A classe tem que implementar Serializable
Todo valor dos atributos(mesmo private) vão ser serializados automaticamente
Se não quiser serializar algum atributo, utilizar a cláusula transient neste atribudo
Se um atributo é uma referência, o objeto apontado por essa será serializado também(Se este objeto tiver implementado a interface Serializable…tudo bem).
Aqui acho que pode te ajudar
Caso o objeto referenciado não implementar Serilizable(e vc não puder mudar isso), há duas opções:
1) Marcar como como transient esse atribudo que possue a referência
2) Serializar os valores desse objeto que não podem ser serializado, implementando dois metodos na sua classe:
writeObject(… e readObject(… pagina 259
De uma forma geral, vejo assim…
A serialização faz tudo sozinha se implementar Serializable…caso tenha que serializar um objeto que não implementa isso, então tem que “pegar” os atributos desse objeto, via getters por exemplo, um por um e implementar sua serialização no método writeObject. Quando deserializar…tem que implementar o método readObject para “pegar” de volta esses atributos, tendo cuidado com a ordem que foram serializados manualmente, e retornar a um novo objetos utilizando setters…
Bom, não sei se ajudei muito…e se estou esquecendo de algo…mais vejo assim.
Sobre asserções eu entendi que a Sun somente não recomenda a fazer e não o compilador inibe essa prática (era a alternativa que eu pensava).
Sobre Serializable eu gostei do seu pequeno resumo, mas a principio quando é citado no livro sobre automático, logo vem a idéia de que a classe serializa todas as sua variáveis. Independente de implementar ou não a interface.
Mais uma vez muito obrigado
Ricardo
Ps: aurelio_silva quando você ta pretendo fazer a prova de certificação ???
Ps: aurelio_silva quando você ta pretendo fazer a prova de certificação ???[/quote]
Marquei para semana que vem, dia 14/10…vou acabar de ler o livro da Kathy esta sexta feira, dai faço todos os exercicios do livro de novo e depois o simulado do livro…cara tem que dar certo porque quarta feira dia 15/10 começo a trabalhar…rsrsr
O que acontece quando eu tenho uma classe que implementa a interface e a superclasse não implementa. Então eu serializo a subclasse e deserializo novamente. Eu queria saber se quando deserializa é executado o construtor da classe pai ???
class A { }
class B extends A implements Serializable {
public static void main(String[] args) {
B b1 = new B();
// Aqui executa o código de serialização de A
// Aqui executa o código de deserialização de B
B b2 = (B) readObject(blá); // nesse momento, quando atribuo um objeto a b2 é executado o construtor pai A ???
}
}