Introducció a la Serialització

La serialització és el procés de convertir un objecte en un format que es pot emmagatzemar o transmetre i després reconstruir-lo més tard. En Java, això es fa mitjançant la interfície Serializable. La deserialització és el procés invers, on es reconstrueix l'objecte a partir del format emmagatzemat o transmès.

Conceptes Clau

  • Serialització: Convertir un objecte en un flux de bytes.
  • Deserialització: Reconstruir l'objecte a partir del flux de bytes.
  • Interfície Serializable: Marca una classe com a serialitzable.
  • ObjectOutputStream i ObjectInputStream: Classes utilitzades per escriure i llegir objectes serialitzats.

Exemple Pràctic

Classe Exemple

import java.io.Serializable;

public class Persona implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private String nom;
    private int edat;

    public Persona(String nom, int edat) {
        this.nom = nom;
        this.edat = edat;
    }

    public String getNom() {
        return nom;
    }

    public int getEdat() {
        return edat;
    }

    @Override
    public String toString() {
        return "Persona [nom=" + nom + ", edat=" + edat + "]";
    }
}

Serialització d'un Objecte

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerialitzarExemple {
    public static void main(String[] args) {
        Persona persona = new Persona("Joan", 30);

        try (FileOutputStream fileOut = new FileOutputStream("persona.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
            out.writeObject(persona);
            System.out.println("Objecte serialitzat i guardat a persona.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

Deserialització d'un Objecte

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserialitzarExemple {
    public static void main(String[] args) {
        Persona persona = null;

        try (FileInputStream fileIn = new FileInputStream("persona.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
            persona = (Persona) in.readObject();
            System.out.println("Objecte deserialitzat: " + persona);
        } catch (IOException i) {
            i.printStackTrace();
        } catch (ClassNotFoundException c) {
            System.out.println("Classe Persona no trobada");
            c.printStackTrace();
        }
    }
}

Exercicis Pràctics

Exercici 1: Serialitzar i Deserialitzar un Objecte

  1. Crea una classe Cotxe amb els atributs marca, model i any.
  2. Implementa la interfície Serializable a la classe Cotxe.
  3. Escriu un programa per serialitzar un objecte Cotxe i guardar-lo en un fitxer.
  4. Escriu un altre programa per deserialitzar l'objecte Cotxe des del fitxer i mostrar les seves propietats.

Solució

Classe Cotxe

import java.io.Serializable;

public class Cotxe implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private String marca;
    private String model;
    private int any;

    public Cotxe(String marca, String model, int any) {
        this.marca = marca;
        this.model = model;
        this.any = any;
    }

    public String getMarca() {
        return marca;
    }

    public String getModel() {
        return model;
    }

    public int getAny() {
        return any;
    }

    @Override
    public String toString() {
        return "Cotxe [marca=" + marca + ", model=" + model + ", any=" + any + "]";
    }
}

Serialitzar Cotxe

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerialitzarCotxe {
    public static void main(String[] args) {
        Cotxe cotxe = new Cotxe("Toyota", "Corolla", 2020);

        try (FileOutputStream fileOut = new FileOutputStream("cotxe.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
            out.writeObject(cotxe);
            System.out.println("Objecte Cotxe serialitzat i guardat a cotxe.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

Deserialitzar Cotxe

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserialitzarCotxe {
    public static void main(String[] args) {
        Cotxe cotxe = null;

        try (FileInputStream fileIn = new FileInputStream("cotxe.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
            cotxe = (Cotxe) in.readObject();
            System.out.println("Objecte Cotxe deserialitzat: " + cotxe);
        } catch (IOException i) {
            i.printStackTrace();
        } catch (ClassNotFoundException c) {
            System.out.println("Classe Cotxe no trobada");
            c.printStackTrace();
        }
    }
}

Errors Comuns i Consells

  • No oblidar serialVersionUID: És recomanable definir un serialVersionUID per a les classes serialitzables per evitar problemes de compatibilitat.
  • No serialitzar objectes no serialitzables: Assegura't que tots els objectes dins d'una classe serialitzable també siguin serialitzables.
  • Gestió d'excepcions: Sempre gestiona les excepcions IOException i ClassNotFoundException durant la serialització i deserialització.

Conclusió

La serialització és una tècnica poderosa per emmagatzemar i transmetre objectes en Java. Comprendre com serialitzar i deserialitzar objectes és essencial per a moltes aplicacions, especialment aquelles que necessiten persistència d'objectes o comunicació entre diferents parts d'un sistema. Amb els exemples i exercicis proporcionats, hauríeu de tenir una bona base per començar a utilitzar la serialització en els vostres projectes.

Curs de Programació en Java

Mòdul 1: Introducció a Java

Mòdul 2: Flux de Control

Mòdul 3: Programació Orientada a Objectes

Mòdul 4: Programació Orientada a Objectes Avançada

Mòdul 5: Estructures de Dades i Col·leccions

Mòdul 6: Gestió d'Excepcions

Mòdul 7: Entrada/Sortida de Fitxers

Mòdul 8: Multithreading i Concurrència

Mòdul 9: Xarxes

Mòdul 10: Temes Avançats

Mòdul 11: Frameworks i Llibreries de Java

Mòdul 12: Construcció d'Aplicacions del Món Real

© Copyright 2024. Tots els drets reservats