Serializable?

1 resposta
M

…alguem pode me explicar Serializable? Oque é… pra que serve, e se possivel um exemplo de onde é necessário!

[]'s

1 Resposta

N

Serialização de objetos permite tornar objetos de classes em sequencias de bytes, e depois restaurar para o objetos original. Atravez de uma rede, a serialização permite compensar diferenças entre sistemas operacionais.

Ou seja, vc pode criar um objeto em uma máquina Windows, serializá-lo, enviá-lo pela rede para uma máquina Unix e lá, ele será corretamente reconstruído.

Para gravar um objeto no disco e depois recuperá-lo deixando os detalhes para o sistema vc só precisa serializar o objeto.

Esse recurso é usado também para RMI (Remote Method Invocation) e JavaBeans , leia sobre se lhe interesar.

Tornar uma classe serializável é bem simples: vc só precisa implementar a interface Serializable (ela é só uma flag e não tem nenhum método). Quando vc faz isso, muitas classes padrões são mudadas para se tornarem serializáveis.

Para serializar o objeto (inplementando a interface), vc precisa criar um objeto da classe OutputStream e empacotá-lo dentro de um ObjectOutputStream. Daí, vc só precisa chamar writeObject() e seu objeto será serializado e mandado para o OutputStream. Para o processo reverso, vc empacota um InputStream dentro de um ObjectInputStream e chama readObject()

Segue exemplo tirado do livro Thinking in Java

//: c11:Worm.java
// Demonstrates object serialization.
import java.io.*;

class Data implements Serializable {
  private int i;
  Data(int x) { i = x; }
  public String toString() {
    return Integer.toString(i);
  }
}

public class Worm implements Serializable {
  // Generate a random int value:
  private static int r() {
    return (int)(Math.random() * 10);
  }
  private Data[] d = {
    new Data(r()), new Data(r()), new Data(r())
  };
  private Worm next;
  private char c;
  // Value of i == number of segments
  Worm(int i, char x) {
    System.out.println(" Worm constructor: " + i);
    c = x;
    if(--i > 0)
      next = new Worm(i, (char)(x + 1));
  }
  Worm() {
    System.out.println("Default constructor");
  }
  public String toString() {
    String s = ":" + c + "(";
    for(int i = 0; i < d.length; i++)
      s += d[i].toString();
    s += ")";
    if(next != null)
      s += next.toString();
    return s;
  }
  // Throw exceptions to console:
  public static void main(String[] args) 
  throws ClassNotFoundException, IOException {
    Worm w = new Worm(6, 'a');
    System.out.println("w = " + w);
    ObjectOutputStream out =
      new ObjectOutputStream(
        new FileOutputStream("worm.out"));
    out.writeObject("Worm storage");
    out.writeObject(w);
    out.close(); // Also flushes output
    ObjectInputStream in =
      new ObjectInputStream(
        new FileInputStream("worm.out"));
    String s = (String)in.readObject();
    Worm w2 = (Worm)in.readObject();
    System.out.println(s + ", w2 = " + w2);
    ByteArrayOutputStream bout =
      new ByteArrayOutputStream();
    ObjectOutputStream out2 =
      new ObjectOutputStream(bout);
    out2.writeObject("Worm storage");
    out2.writeObject(w);
    out2.flush();
    ObjectInputStream in2 =
      new ObjectInputStream(
        new ByteArrayInputStream(
          bout.toByteArray()));
    s = (String)in2.readObject();
    Worm w3 = (Worm)in2.readObject();
    System.out.println(s + ", w3 = " + w3);
  }
} ///:~

Tirei as informações do libro Thinking in Java, 2nd Edition, Revision 11, capítulo 11, no tópico Object Serialization. Esse livro tem por aí na internet.

Criado 23 de outubro de 2003
Ultima resposta 29 de out. de 2003
Respostas 1
Participantes 2