"Você se lembra que hoje investigamos como salvar objetos e lê-los de um arquivo?"

"Sim, acabamos de salvar em um fluxo de saída, uma leitura de um fluxo de entrada."

"Muito bem, amigo. É bom saber que você está percebendo esses detalhes. Você seria capaz de completar o código para que ele salve e leia de um arquivo?"

"Complete o quê?! Declare um FileInputStream e FileOutputStream e passe-os para os métodos save e load. Não há nada para se confundir aqui. Super simples."

"Estou feliz por você. Agora um novo tópico: serialização ."

A serialização é quase igual ao que acabamos de fazer, mas muito mais legal e integrada à máquina Java. A máquina Java pode armazenar e carregar seus objetos. Ele nem precisa dos métodos save e load para fazer isso: todos os objetos são armazenados dentro da máquina Java e ela tem acesso total a eles."

Nós apenas pegamos o objeto e o salvamos em um stream e lemos de um stream:

Código
public static void main(String[] args) throws Exception
{
 Cat cat = new Cat();

 //Save a cat to file
 FileOutputStream fileOutput = new FileOutputStream("cat.dat");
 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
 outputStream.writeObject(cat);
 fileOutput.close();
 outputStream.close();

 //Load a cat from file
 FileInputStream fiStream = new FileInputStream("cat.dat");
 ObjectInputStream objectStream = new ObjectInputStream(fiStream);
 Object object = objectStream.readObject();
 fiStream.close();
 objectStream.close();

 Cat newCat = (Cat)object;
}

"É isso?"

"Exatamente. Existe um mecanismo de serialização muito grande e complexo que nos permite salvar em um fluxo e ler de um fluxo de quase qualquer tipo de dados."

"Quase nenhum. Então nenhum tipo de dado?"

"Sim, o fato é que nem todos os objetos têm a capacidade inerente de serem salvos . Alguns objetos não armazenam todos os seus dados internamente. Em vez disso, eles apenas fazem referência a outros objetos e/ou fontes de dados. Por exemplo, o console (System. in), um fluxo de entrada (InputStream) e outras coisas."

É por isso que os criadores de Java criaram o marcador de interface serializável especial . É chamado de marcador , porque não contém dados e métodos. É usado apenas para "marcar" ou "marcar" classes. Se acreditarmos que nossa classe armazena todos os seus dados internamente, podemos marcá-la com implements Serializable .

Aqui está um exemplo «cat» com suporte para serialização:

Código
class Cat implements Serializable
{
 public String name;
 public int age;
 public int weight;
}

Quando tentamos serializar (salvar) um objeto, a máquina Java verifica se ele suporta a serialização: Ela implementa a interface Serializable? Em caso afirmativo, ele salva o objeto. Caso contrário, ele lançará uma exceção para indicar que a serialização é impossível.
Aqui você precisa entender que um objeto serializável deve consistir apenas em objetos serializáveis.

"Bem, isso faz sentido. Você não pode salvar o todo sem salvar suas partes."

"Exatamente."

"E quanto a ints, Strings e ArrayLists?"

"Todos eles oferecem suporte à serialização. Os criadores do Java tiveram um cuidado especial para garantir que isso acontecesse. Não deve haver nenhum problema aqui."

Além disso, o tipo de um objeto é salvo quando o objeto é serializado. Agora você pode salvar uma referência a um objeto Cat em uma variável Object. Tudo vai serializar e desserializar muito bem.

"Deserialize?"

" A desserialização é o processo de reversão da serialização: ler e reconstruir um objeto de um fluxo/arquivo."

"Ah, sem mais perguntas então."