"¡Hola, Amigo! Hoy aprenderemos sobre otro tema interesante. Específicamente, guardar y cargar (reconstruir) objetos . Supongamos que tenemos una clase Cat:"

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

Y digamos que queremos agregar un mecanismo conveniente para guardar y cargar desde un archivo.

Podríamos hacerlo así:

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

    public void save(PrintWriter writer) throws Exception {
        writer.println(name);
        writer.println(age);
        writer.println(weight);
        writer.flush();
    }

    public void load(BufferedReader reader) throws Exception {
        name = reader.readLine();
        age = Integer.parseInt(reader.readLine());
        weight = Integer.parseInt(reader.readLine());
    }
}

"¡Vaya! ¡Es tan fácil! Simplemente escribimos los valores de cada argumento, uno en cada línea. Cuando cargamos el archivo, los leemos en el mismo orden. Es la solución perfecta".

"Gracias, Amigo. Ahora puedes escribir los métodos de guardar y cargar para este grupo de clases:"

Código
class Cat
{
 public String name;
 public int age;
 public int weight;
}
class Dog
{
 public String name;
 public int age;
}
class Human
{
 public Cat cat;
 public Dog dog;
}

Tienes un objeto humano, que puede tener un perro y un gato.

"Tengo una solución:"

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

    public void save(PrintWriter writer) throws Exception {
        writer.println(name);
        writer.println(age);
        writer.println(weight);
        writer.flush();
    }

    public void load(BufferedReader reader) throws Exception {
        name = reader.readLine();
        age = Integer.parseInt(reader.readLine());
        weight = Integer.parseInt(reader.readLine());
    }
}
Código
class Dog {
    public String name;
    public int age;

    public void save(PrintWriter writer) throws Exception {
        writer.println(name);
        writer.println(age);
        writer.flush();
    }

    public void load(BufferedReader reader) throws Exception {
        name = reader.readLine();
        age = Integer.parseInt(reader.readLine());
    }
}
Código
public class Human {
    public Cat cat;
    public Dog dog;

    public void save(PrintWriter writer) throws Exception {
        cat.save(writer);
        dog.save(writer);
    }

    public void load(BufferedReader reader) throws Exception {
        cat.load(reader);
        dog.load(reader);
    }
}

"Esa es una muy buena solución. Pero, ¿qué sucede si un humano tiene un perro pero no un gato?"

¿Dónde están los cheques nulos?

"Lo arreglaré ahora:"

Código
public class Human {
    public Cat cat;
    public Dog dog;

    public void save(PrintWriter writer) throws Exception {
        if (cat != null)
            cat.save(writer);
        if (dog != null)
            dog.save(writer);
    }

    public void load(BufferedReader reader) throws Exception {
        cat = new Cat();
        cat.load(reader);
        dog = new Dog();
        dog.load(reader);
    }
}

"Todavía no está del todo bien. Tienes dos errores:"

1) Es posible que una persona no tenga un gato o un perro, pero aun así se crearán cuando se llame al método de carga

2) Si solo guardamos un perro, sus datos serán leídos por el gato cuando se cargue.

"Bueno, ¿qué debo hacer?"

" No podemos omitir la escritura de las variables, de lo contrario, tendremos problemas durante la lectura . Debe asegurarse de que las variables que son nulas durante la operación de guardar se establezcan en nulas durante la operación de carga. Esta es mi versión:"

Código
public class Human {
    public Cat cat;
    public Dog dog;

    public void save(PrintWriter writer) throws Exception {
        String isCatPresent = cat != null ? "yes" : "no";
        writer.println(isCatPresent);
        writer.flush();

        if (cat != null)
            cat.save(writer);

        String isDogPresent = dog != null ? "yes" : "no";
        writer.println(isDogPresent);
        writer.flush();

        if (dog != null)
            dog.save(writer);
    }

    public void load(BufferedReader reader) throws Exception {

        String isCatPresent = reader.readLine();
        if (isCatPresent.equals("yes")) {
            cat = new Cat();
            cat.load(reader);
        }

        String isDogPresent = reader.readLine();
        if (isDogPresent.equals("yes")) {
            dog = new Dog();
            dog.load(reader);
        }
    }
}

"Sí, me gusta esta solución".

"Sí, es agradable".