"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:
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:
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."
GO TO FULL VERSION