"¿Recordarás que hoy investigamos cómo guardar objetos y leerlos desde un archivo?"

"Sí, acabamos de guardar en un flujo de salida, una lectura de un flujo de entrada".

"Bien hecho, Amigo. Es bueno escuchar que estás notando estos detalles. ¿Serías capaz de completar el código para que se guarde y lea desde un archivo?"

"¡¿Completar qué?! Declarar FileInputStream y FileOutputStream y pasarlos a los métodos de guardar y cargar. No hay nada de qué confundirse aquí. Súper simple".

"Me alegro por ti. Ahora un nuevo tema: serialización ".

La serialización es casi lo mismo que acabamos de hacer, pero mucho más genial y está integrado directamente en la máquina Java. La máquina Java puede almacenar y cargar sus objetos. Ni siquiera necesita los métodos de guardar y cargar para hacerlo: todos los objetos se almacenan dentro de la máquina Java y tiene acceso total a ellos".

Simplemente tomamos el objeto y lo guardamos en una secuencia y leemos de una secuencia:

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;
}

"¿Eso es todo?"

"Exactamente. Hay un mecanismo de serialización muy grande y complejo que nos permite guardar en un flujo y leer desde un flujo de casi cualquier tipo de datos".

"Casi cualquiera. Entonces, ¿no cualquier tipo de datos?"

"Sí, el hecho es que no todos los objetos tienen la capacidad inherente de guardarse . Algunos objetos no almacenan todos sus datos internamente. En su lugar, simplemente hacen referencia a otros objetos y/o fuentes de datos. Por ejemplo, la consola (System. in), un flujo de entrada (InputStream) y otras cosas".

Es por eso que a los creadores de Java se les ocurrió el marcador de interfaz Serializable especial . Se llama marcador porque no contiene datos ni métodos. Solo se usa para "etiquetar" o "marcar" clases. Si creemos que nuestra clase almacena todos sus datos internamente, podemos marcarla con implements Serializable .

Aquí hay un ejemplo de «gato» con soporte para serialización:

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

Cuando tratamos de serializar (guardar) un objeto, la máquina Java verifica si admite la serialización: ¿Implementa la interfaz Serializable? Si lo hace, entonces guarda el objeto. Si no, lanza una excepción para indicar que la serialización es imposible.
Aquí debe comprender que un objeto serializable solo debe consistir en objetos serializables.

"Bueno, eso tiene sentido. No puedes salvar el todo sin salvar sus partes".

"Exactamente."

"¿Y qué pasa con ints, Strings y ArrayLists?"

"Todos son compatibles con la serialización. Los creadores de Java tuvieron especial cuidado para asegurarse de que esto sucediera. No debería haber ningún problema aquí".

Además, el tipo de un objeto se guarda cuando el objeto se serializa. Ahora puede guardar una referencia a un objeto Cat en una variable Object. Todo se serializará y deserializará bien.

"¿Deserializar?"

" La deserialización es el proceso de invertir la serialización: leer y reconstruir un objeto a partir de un flujo/archivo".

"Ah, no más preguntas entonces."