COMPARTE ESTE ARTÍCULO

En este artículo te muestro, paso a paso, cómo modelar una Persona con nombre, apellido y DNI (con validación española), cómo almacenar varias personas en un ArrayList, serializar esa lista y guardarla en un archivo binario. Además, veremos cómo leer el archivo para recuperar los objetos.


Requisitos

  • JDK 17 o superior (vale desde 8, pero recomiendo 17+).
  • Cualquier IDE (IntelliJ / Eclipse / NetBeans) o la terminal.
  • Conocimientos básicos de Java y colecciones.

¿Qué es “serializar” en Java?

Serializar es convertir un objeto a una secuencia de bytes para poder guardarlo (por ejemplo, en un archivo) o enviarlo por red. En Java se hace implementando la interfaz Serializable y usando ObjectOutputStream / ObjectInputStream.


Estructura del proyecto

src/
 ├─ Persona.java
 └─ Main.java

Clase Persona (con validación de DNI)

  • Campos: nombre, apellido, dni.
  • Implementa Serializable.
  • Valida el DNI español (8 dígitos + letra correcta).

Nota: El algoritmo de la letra del DNI usa la cadena "TRWAGMYFPDXBNJZSQVHLCKE".
Letra = letras[numero % 23].

// Persona.java
import java.io.Serializable;

public class Persona implements Serializable {
    private static final long serialVersionUID = 1L;

    private final String nombre;
    private final String apellido;
    private final String dni; // Formato: 8 dígitos + letra correcta (ej: 12345678Z)

    public Persona(String nombre, String apellido, String dni) {
        if (nombre == null || nombre.isBlank()) {
            throw new IllegalArgumentException("El nombre no puede estar vacío.");
        }
        if (apellido == null || apellido.isBlank()) {
            throw new IllegalArgumentException("El apellido no puede estar vacío.");
        }
        String normalizado = (dni == null) ? "" : dni.trim().toUpperCase();
        if (!isDniValido(normalizado)) {
            throw new IllegalArgumentException("DNI inválido: " + dni);
        }
        this.nombre = nombre.trim();
        this.apellido = apellido.trim();
        this.dni = normalizado;
    }

    public String getNombre()   { return nombre; }
    public String getApellido() { return apellido; }
    public String getDni()      { return dni; }

    @Override
    public String toString() {
        return nombre + " " + apellido + " (" + dni + ")";
    }

    // ====== Validación DNI ======
    public static boolean isDniValido(String dni) {
        if (dni == null) return false;
        dni = dni.trim().toUpperCase();
        if (!dni.matches("\\d{8}[A-Z]")) return false;

        String letras = "TRWAGMYFPDXBNJZSQVHLCKE";
        int numero = Integer.parseInt(dni.substring(0, 8));
        char letraEsperada = letras.charAt(numero % 23);
        return dni.charAt(8) == letraEsperada;
    }
}

Programa principal: crear ArrayList<Persona>, serializar y deserializar

  • Creamos algunas personas de ejemplo.
  • Guardamos el ArrayList en personas.bin.
  • Leemos el archivo y listamos por consola.

Ejecución desde la terminal

Dentro del directorio src (o ajusta rutas según tu IDE):

javac Persona.java Main.java
java Main

Verás algo como:

✅ Guardadas 3 personas en: personas.bin
Personas leídas desde el archivo:
 - Ana López (12345678Z)
 - Carlos Pérez (11111111H)
 - Lucía Martín (87654321X)

Se crea el archivo personas.bin en el directorio actual.


Añadiendo personas por consola (opcional)

Si prefieres pedir datos al usuario, puedes usar Scanner y luego llamar a guardarPersonas(...).
Consejo: siempre valida el DNI antes de crear la Persona.

// Fragmento opcional para leer por consola
/*
Scanner sc = new Scanner(System.in);
System.out.print("Nombre: ");
String nombre = sc.nextLine();
System.out.print("Apellido: ");
String apellido = sc.nextLine();
System.out.print("DNI (8 dígitos + letra): ");
String dni = sc.nextLine();

if (!Persona.isDniValido(dni)) {
    System.out.println("DNI inválido.");
} else {
    personas.add(new Persona(nombre, apellido, dni));
    guardarPersonas(personas, RUTA_ARCHIVO);
}
*/

Errores comunes y cómo resolverlos

  • java.io.NotSerializableException
    Alguna clase en tu grafo de objetos no implementa Serializable. Asegúrate de que Persona (y cualquier otra clase interna) lo implemente.
  • InvalidClassException tras cambios en la clase
    Cambiar la estructura de la clase después de haber serializado puede romper la lectura. Define un serialVersionUID fijo para mayor control.
  • ClassCastException al leer
    Verifica que el archivo contiene exactamente una List<Persona> (y no otra cosa).

Copiar/pegar en WordPress

  • En el editor de bloques (Gutenberg), inserta un bloque Código y pega los fragmentos con el idioma Java para resaltar sintaxis.
  • Estructura el post con H2/H3, tal como en este artículo, para buen SEO y legibilidad.

Resumen

  • Modelamos Persona con validación de DNI.
  • Usamos ArrayList<Persona> para almacenar varias personas.
  • Serializamos con ObjectOutputStream a personas.bin.
  • Deserializamos con ObjectInputStream para recuperar la lista.


¿QUÉ TE HA PARECIDO EL ARTÍCULO? Danos tu opinión al final de la página.
Deja tu comentario y ayúdanos a crecer.


¡SÍGUENOS EN TUS REDES FAVORITAS!
AYUDANOS A CRECER Y QUE LLEGUEMOS A TODAS LAS PERSONAS QUE NOS NECESITANA. SÍGUENOS EN TUS REDES.
Entra AQUÍ y elíge donde seguirnos. 

 

 


NUESTRAS ÚLTIMAS PUBLICACIONES

INSTAGRAM

TIKTOK


 …Y PRONTO MUCHAS MÁS

AYUDANOS A CRECER Y A LLEGAR A TODAS LAS PERSONAS QUE NOS NECESITAN.

Contenido restringido

Acceso de usuarios existentes
   
Registro de un nuevo usuario
*Campo necesario

Tags:

Comments are closed

Estado de acceso
ESTADO DE ACCESO
TRADUCTORES
COMPARTENOS
Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert
error: CONTENIDO PROTEGIDO