Serializable?

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

[]'s

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.