[Serialização ] O que acontece quando uso ObjectOutputStream.defaultWriteObject()?[Respondido]

O que acontece quando uso ObjectOutputStream.defaultWriteObject()?
Quando usar ObjectOutputStream.defaultWriteObject()?

Estou estudando para certificação e vi esse método mais não sei explica para que ele serve, o que ele faz e quando usar.

Um exemplo do uso de defaultWriteObject e defaultReadObject. Como você vê, o uso desses métodos é muito restrito e você não precisa saber desses métodos para a prova; entretanto, é bom estudar a interface Externalizable também.

import java.io.*;


class Aspidistra implements Serializable {
    public Aspidistra (String value) {this.value = value;}
    public String toString() { return value; }
    private String value;

    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
        System.out.println ("Now serializing object " + this);
        out.defaultWriteObject();
    }
    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        System.out.println ("Deserializing object " + this);
    }
}


class TesteImplementsSerializable {
    public static void main(String[] args) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream ();
        ObjectOutputStream oos = new ObjectOutputStream (baos);
        oos.writeObject (new Aspidistra ("elatior"));
        oos.close();
        byte[] bytes = baos.toByteArray();
        ByteArrayInputStream bais = new ByteArrayInputStream (bytes);
        ObjectInputStream ois = new ObjectInputStream (bais);
        Aspidistra asp = (Aspidistra) ois.readObject ();
        System.out.println (asp);
    }    
}

Isso me lembra de uma dúvida cruel que tive enquanto estudava para a certificação:

Por que os métodos writeObject e readObject não ficam em uma interface? Esse negócio de ter que escrever a assinatura certinho sem nenhuma checagem é um pouco desconfortável, parece meio… “não-java”

[quote=gomesrod]Isso me lembra de uma dúvida cruel que tive enquanto estudava para a certificação:

Por que os métodos writeObject e readObject não ficam em uma interface? Esse negócio de ter que escrever a assinatura certinho sem nenhuma checagem é um pouco desconfortável, parece meio… “não-java”[/quote]

É bem quebra-galho mesmo. Tanto que em .NET não existe uma interface Serializable (que no Java é uma “marker interface” e serve só para a JVM saber que determinada classe pode ser serializada); em .NET existe um “attribute” (no Java chamaríamos de “Annotation”) que indica se a classe é serializável (http://msdn.microsoft.com/pt-br/library/system.serializableattribute.aspx ). Além disso, existe um “attribute” que indica se um membro de uma classe é não-serializável (“transient” em Java).

[quote=thingol]Um exemplo do uso de defaultWriteObject e defaultReadObject. Como você vê, o uso desses métodos é muito restrito e você não precisa saber desses métodos para a prova; entretanto, é bom estudar a interface Externalizable também.

[code]
import java.io.*;

class Aspidistra implements Serializable {
public Aspidistra (String value) {this.value = value;}
public String toString() { return value; }
private String value;

private void writeObject(java.io.ObjectOutputStream out) throws IOException {
    System.out.println ("Now serializing object " + this);
    out.defaultWriteObject();
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    System.out.println ("Deserializing object " + this);
}

}

class TesteImplementsSerializable {
public static void main(String[] args) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ObjectOutputStream oos = new ObjectOutputStream (baos);
oos.writeObject (new Aspidistra (“elatior”));
oos.close();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream (bytes);
ObjectInputStream ois = new ObjectInputStream (bais);
Aspidistra asp = (Aspidistra) ois.readObject ();
System.out.println (asp);
}
}
[/code] Vou analisar o código.
A minha idéia seria entender o que defaultWriteObject() faz.
Estou estudando detalhadamente todos os tópicos para certificação, os conceitos, erros, quando usar e não usar e etc.
O que não entendi é o que esse método(defaultWriteObject()) faz!
[/quote]

[quote=silvano.pessoa]Vou analisar o código.
A minha idéia seria entender o que defaultWriteObject() faz.
Estou estudando detalhadamente todos os tópicos para certificação, os conceitos, erros, quando usar e não usar e etc.
O que não entendi é o que esse método(defaultWriteObject()) faz!
[/quote]
Olha, isso é MUITO simples (hehe, é mentira, mas precisava dar umas palavras de incentivo). Se você tiver entendido bem o que fazem o readObject e writeObject, fica mais fácil. Vamos dizer que são métodos que servem para “personalizar” a serialização/desserialização daquele objeto.

Ou seja, se por algum motivo o seu objeto deve ter uma serialização especial (geralmente o motivo é a presença de atributos não serializáveis, que iam fazer o processo dar erro), você implementa esses dois métodos. Essa é uma maneira de dizer:

  • Ei, Java, EU sei como serializar esse objeto, não se meta!

Então o que acontece? Quando o programa mandar serializar esse objeto, a JVM não vai faze-lo, vai simplesmente chamar o método writeObject e dizer: Aí, se vira, vc não disse que sabia fazer? Ah, a propósito, toma aqui esse ObjectOutputStream para você jogar os bytes depois que tiver serializado

Você então fica um pouco triste… na verdade você só precisava cuidar daquele detalhezinho especial, aqueles atributos que não são serializáveis… Por causa deles você vai ter que cuidar de toda a serialização do objeto NA MÃO? Todos aqueles atributos int, Strings, Arrays? O Java te vê meio cabisbaixo, se comove, e vem fazer uma proposta:

  • Olha cara, vou te dar um boi. Eu faço a serialização do objeto inteiro, que modéstia à parte sei fazer muito bem. Cuide só daquelas partes difíceis, que só você conhece. Vamos combinar o seguinte: você cuida da sua parte, e quando for a minha vez me avise. Vou te dar esse método, defaultWriteObject , basta chama-lo e eu entro em ação. Mas não esqueça, vou serializar seu objeto inteiro como se fosse um objeto qualquer, então antes de chama-lo tire do caminho os atributos não serializaveis, senão eu não consigo.

  • Valeu, muito obrigado mesmo, fico te devendo uma.

Fim.


Na hora de desserializar é a mesma coisa, só que ao contrário.

Enfim, um exemplo tosco, espero que preste para alguma coisa.

Encontrei a resposta:

ObjectOutputStream.defaultWriteObject(); // Faz o processo de Serialização normal
ObjectOutputStream.writeObject(obj);// Faz o processo de Serialização Manual

[quote=gomesrod][quote=silvano.pessoa]Vou analisar o código.
A minha idéia seria entender o que defaultWriteObject() faz.
Estou estudando detalhadamente todos os tópicos para certificação, os conceitos, erros, quando usar e não usar e etc.
O que não entendi é o que esse método(defaultWriteObject()) faz!
[/quote]
Olha, isso é MUITO simples (hehe, é mentira, mas precisava dar umas palavras de incentivo). Se você tiver entendido bem o que fazem o readObject e writeObject, fica mais fácil. Vamos dizer que são métodos que servem para “personalizar” a serialização/desserialização daquele objeto.

Ou seja, se por algum motivo o seu objeto deve ter uma serialização especial (geralmente o motivo é a presença de atributos não serializáveis, que iam fazer o processo dar erro), você implementa esses dois métodos. Essa é uma maneira de dizer:

  • Ei, Java, EU sei como serializar esse objeto, não se meta!

Então o que acontece? Quando o programa mandar serializar esse objeto, a JVM não vai faze-lo, vai simplesmente chamar o método writeObject e dizer: Aí, se vira, vc não disse que sabia fazer? Ah, a propósito, toma aqui esse ObjectOutputStream para você jogar os bytes depois que tiver serializado

Você então fica um pouco triste… na verdade você só precisava cuidar daquele detalhezinho especial, aqueles atributos que não são serializáveis… Por causa deles você vai ter que cuidar de toda a serialização do objeto NA MÃO? Todos aqueles atributos int, Strings, Arrays? O Java te vê meio cabisbaixo, se comove, e vem fazer uma proposta:

  • Olha cara, vou te dar um boi. Eu faço a serialização do objeto inteiro, que modéstia à parte sei fazer muito bem. Cuide só daquelas partes difíceis, que só você conhece. Vamos combinar o seguinte: você cuida da sua parte, e quando for a minha vez me avise. Vou te dar esse método, defaultWriteObject , basta chama-lo e eu entro em ação. Mas não esqueça, vou serializar seu objeto inteiro como se fosse um objeto qualquer, então antes de chama-lo tire do caminho os atributos não serializaveis, senão eu não consigo.

  • Valeu, muito obrigado mesmo, fico te devendo uma.

Fim.


Na hora de desserializar é a mesma coisa, só que ao contrário.

Enfim, um exemplo tosco, espero que preste para alguma coisa.[/quote]

Entendi vlw!
Conclui meus estudos sobre serialização!
Agora vou para collection, fazer uma tabela de qual usar, quando usar e etc!

[quote=gomesrod][quote=silvano.pessoa]Vou analisar o código.
A minha idéia seria entender o que defaultWriteObject() faz.
Estou estudando detalhadamente todos os tópicos para certificação, os conceitos, erros, quando usar e não usar e etc.
O que não entendi é o que esse método(defaultWriteObject()) faz!
[/quote]
Olha, isso é MUITO simples (hehe, é mentira, mas precisava dar umas palavras de incentivo). Se você tiver entendido bem o que fazem o readObject e writeObject, fica mais fácil. Vamos dizer que são métodos que servem para “personalizar” a serialização/desserialização daquele objeto.

Ou seja, se por algum motivo o seu objeto deve ter uma serialização especial (geralmente o motivo é a presença de atributos não serializáveis, que iam fazer o processo dar erro), você implementa esses dois métodos. Essa é uma maneira de dizer:

  • Ei, Java, EU sei como serializar esse objeto, não se meta!

Então o que acontece? Quando o programa mandar serializar esse objeto, a JVM não vai faze-lo, vai simplesmente chamar o método writeObject e dizer: Aí, se vira, vc não disse que sabia fazer? Ah, a propósito, toma aqui esse ObjectOutputStream para você jogar os bytes depois que tiver serializado

Você então fica um pouco triste… na verdade você só precisava cuidar daquele detalhezinho especial, aqueles atributos que não são serializáveis… Por causa deles você vai ter que cuidar de toda a serialização do objeto NA MÃO? Todos aqueles atributos int, Strings, Arrays? O Java te vê meio cabisbaixo, se comove, e vem fazer uma proposta:

  • Olha cara, vou te dar um boi. Eu faço a serialização do objeto inteiro, que modéstia à parte sei fazer muito bem. Cuide só daquelas partes difíceis, que só você conhece. Vamos combinar o seguinte: você cuida da sua parte, e quando for a minha vez me avise. Vou te dar esse método, defaultWriteObject , basta chama-lo e eu entro em ação. Mas não esqueça, vou serializar seu objeto inteiro como se fosse um objeto qualquer, então antes de chama-lo tire do caminho os atributos não serializaveis, senão eu não consigo.

  • Valeu, muito obrigado mesmo, fico te devendo uma.

Fim.


Na hora de desserializar é a mesma coisa, só que ao contrário.

Enfim, um exemplo tosco, espero que preste para alguma coisa.[/quote]

huahu … belo post ! parece a própria Kathy Sierra escrevendo com essas piadinhas ! :lol:
até mais