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. ObjectOutputStreamiObjectInputStream: 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
Cotxeamb els atributsmarca,modeliany. - Implementa la interfície
Serializablea la classeCotxe. - Escriu un programa per serialitzar un objecte
Cotxei guardar-lo en un fitxer. - Escriu un altre programa per deserialitzar l'objecte
Cotxedes 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 unserialVersionUIDper 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
IOExceptioniClassNotFoundExceptiondurant 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
