Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Java

Serialización de Objetos en Java: Persistencia y Restauración de Objetos

Java proporciona un mecanismo llamado serialización de objetos donde un objeto se representa como una secuencia de bytes que incluye sus datos, información sobre su tipo y los tipos de datos almacenados.

Tras escribir un objeto serializado en un archivo, puede leerse y deserializar: la información de tipo y los bytes recrean el objeto en memoria. El proceso es independiente de la JVM: un objeto serializado en una plataforma puede deserializarse en otra distinta.

Clases Clave

Requisitos para Serializar una Clase

  1. Implementar la interfaz java.io.Serializable (interfaz marcador, sin métodos).
  2. Todos los campos deben ser serializables. Si un campo no lo es, márcalo transient.

Para saber si una clase estándar es serializable: consulta su documentación; si implementa Serializable, lo es.

Ejemplo: Clase Employee Serializable


public class Employee implements java.io.Serializable {
    public String name;
    public String address;
    public transient int SSN; // no se serializa
    public int number;

    public void mailCheck() {
        System.out.println("Enviando cheque a " + name + " " + address);
    }
}

Serializando un Objeto

Convención: archivo con extensión .ser.

Ejemplo: SerializeDemo


import java.io.*;

public class SerializeDemo {
    public static void main(String[] args) {
        Employee e = new Employee();
        e.name = "Reyan Ali";
        e.address = "Phokka Kuan, Ambehta Peer";
        e.SSN = 11122333;
        e.number = 101;

        try {
            FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(e);
            out.close();
            fileOut.close();
            System.out.printf("Datos serializados guardados en /tmp/employee.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

Deserializando un Objeto

Ejemplo: DeserializeDemo


import java.io.*;

public class DeserializeDemo {
    public static void main(String[] args) {
        Employee e = null;
        try {
            FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            e = (Employee) in.readObject(); // cast necesario
            in.close();
            fileIn.close();
        } catch (IOException i) {
            i.printStackTrace();
            return;
        } catch (ClassNotFoundException c) {
            System.out.println("Clase Employee no encontrada");
            c.printStackTrace();
            return;
        }

        System.out.println("Empleado deserializado...");
        System.out.println("Nombre: " + e.name);
        System.out.println("Dirección: " + e.address);
        System.out.println("SSN: " + e.SSN); // 0 porque es transient
        System.out.println("Número: " + e.number);
    }
}

Salida:

Empleado deserializado...
Nombre: Reyan Ali
Dirección: Phokka Kuan, Ambehta Peer
SSN: 0
Número: 101

Puntos Importantes

Versionado y serialVersionUID

Para control de versiones entre serialización y deserialización, declara:


private static final long serialVersionUID = 1L;

Si no se declara, la JVM lo calcula automáticamente basado en la estructura de la clase; cambios en la clase pueden invalidar objetos serializados previos.

Casos de Uso Comunes

Alternativas Modernas

Para serialización robusta, multiplataforma y versionable, considera:

La serialización nativa de Java es conveniente pero frágil ante cambios de clase y no es segura para datos no confiables (riesgo de deserialización maliciosa).

Java

  1. Palabra clave final en Java: Variables, métodos y clases
  2. Operador instanceof en Java: Guía completa
  3. Dominando la herencia en Java: Conceptos, tipos y ejemplos prácticos
  4. Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
  5. Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
  6. Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
  7. Dominando la Reflexión en Java: Inspeccionando clases, métodos y campos en tiempo de ejecución
  8. Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
  9. Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
  10. Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación
  11. Domina Java: Entendiendo Objetos, Clases y Conceptos Básicos de POO