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
iObjectInputStream
: 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
- Crea una classe
Cotxe
amb els atributsmarca
,model
iany
. - Implementa la interfície
Serializable
a la classeCotxe
. - Escriu un programa per serialitzar un objecte
Cotxe
i guardar-lo en un fitxer. - 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 unserialVersionUID
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
iClassNotFoundException
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
- Introducció a Java
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Operadors
Mòdul 2: Flux de Control
Mòdul 3: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Mètodes
- Constructors
- Herència
- Polimorfisme
- Encapsulació
- Abstracció
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
- Lectura de Fitxers
- Escriptura de Fitxers
- Fluxos de Fitxers
- BufferedReader i BufferedWriter
- Serialització
Mòdul 8: Multithreading i Concurrència
- Introducció al Multithreading
- Creació de Fils
- Cicle de Vida dels Fils
- Sincronització
- Utilitats de Concurrència
Mòdul 9: Xarxes
- Introducció a les Xarxes
- Sockets
- ServerSocket
- DatagramSocket i DatagramPacket
- URL i HttpURLConnection