Persistencia en Java - Serialización

chernando 11,016 views 38 slides May 05, 2011
Slide 1
Slide 1 of 38
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38

About This Presentation

Curso (y ejercicios) del uso de la serialización como técnica de persistencia en Java.


Slide Content

Persistencia en JAVA
Serialización
Carlos Hernando Carasol
[email protected]
5 de Mayo de 2011

Índice de contenidos
Concepto de serialización
Serialización en Java
Objetos compuestos y complejos
Elementos no serializables
Extendiendo serialización
Limitaciones

Serialización: concepto
“... is the process of converting a data
structure or object into a format that can
be stored” Wikipedia
Aplanar estructuras
… en un formato que pueda reconstruir

Un ejemplo

Otros ejemplos
XML
JSON

Usos de la serialización
Guardar a fichero
Transmitir por red
RMI
En JEE, guardar en la sesión HTTP

Serialización en Java
Se utiliza el interfaz Serializable
No requiere implementación de ningún
tipo
Puede utilizarse en “todas” las clases
Recordatorio: implements también se hereda
Las principales clases de Java ya son
serializables.

Ejemplo no serializable
public class Jugador {
String nombre;
public Jugador(String nombre) {
this.nombre = nombre;
}
public static void main(String[] args) {
Jugador jugador = new Jugador("Carlos");
System.out.println(jugador.nombre);
}
}

Ejemplo serializable
public class Jugador implements Serializable {
String nombre;
public Jugador(String nombre) {
this.nombre = nombre;
}
public static void main(String[] args) {
Jugador jugador = new Jugador("Carlos");
System.out.println(jugador.nombre);
}
}

Objeto
→ Exterior
ObjectOutputStream
oos.writeObject(jugador)
Solamente es necesario que jugador
implemente Serializable

Exterior
→ Objeto
ObjectInputStream
Jugador jugador =
(Jugador) ois.readObject()
Es necesario que jugador implemente
Serializable
Es necesario realizar una conversión

Ejemplo
try {
FileOutputStream fos = new
FileOutputStream("fichero.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(jugador);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}

Ejercicio
Crear una clase Jugador:
nombre, cadena
vida, entero de 0 a 100
últimaEntrada, fecha con la última vez que
guardo
Crear un programa (no es necesario UI):
Si hay jugador guardado, recuperar (preguntar)
Si no hay, crear uno (podéis pedir datos)
Mostrar datos, guardar y salir

Serializar un objeto compuesto
Añado la clase Inventario a Jugador:
public class Jugador implements Serializable{
String nombre;
Inventario inventario;

}

Todos han de ser serializable
java.io.WriteAbortedException : writing aborted;
java.io.NotSerializableException : Inventario

Solución 1
Nos interesa serializar la estructura
relacionada
public class Inventario implements Serializable {

Solución 2
No nos interesa serializar la estructura
relacionada:
transient Inventario inventario;
Recordatorio: la estructura se pierde por
el camino, al recuperar será Null.

Motivos para no serializar
El atributo es temporal
No tiene atributos, por ejemplo un
controlador
El atributo no debería ser persistido, por
ejemplo un Thread o un Socket.

Ejercicio
Añadir la clase Inventario:
dinero, float
capacidad, entero con valor por defecto 100
peso, entero de tipo transient
Añadir un inventario al jugador.
Modificar el programa para:
El jugador parte con dinero 1000.0
Muestre los atributos del Inventario antes de
guardar.

Serializar estructuras complejas
En Java los Collections son serializables

Deep / Shallow copy
Profundidad de la copia
Serializable Deep
Se realiza una copia de todos los elementos
Clone Shallow
Se copia la instancia y se referencia el resto

Ejercicio
Añadimos la clase Equipo:
nombre, string
cantidad, entero positivo
peso (por unidad), entero positivo
Añadimos una lista de equipo al inventario
Mostramos la lista de todo el equipo.

Ampliar métodos de serialización
private void
writeObject(java.io.ObjectOutputStream out)
throws IOException
private void
readObject(java.io.ObjectInputStream in)
throws IOException,
ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;

Ejemplo
private void readObject(ObjectInputStream in) throws
IOException,
ClassNotFoundException {
in.defaultReadObject();
// Haciendo trampas
System.out.println("Inventario - dinero: " +
this.inventario.dinero);
this.inventario.dinero += 100;
System.out.println("Inventario - dinero: " +
this.inventario.dinero);
}

Ejercicio
Calcular el peso del equipo con
readObject

Ejercicio
Convertir en transient:
Jugador.vida
Inventario.equipo
Guardarlos mediante writeObject

Limitar la serialización
Sobrescribir los métodos provocando
excepciones
private void writeObject(ObjectOutputStream out) throws
IOException {
throw new NotSerializableException ("No!");
}
private void readObject(ObjectInputStream in) throws
IOException {
throw new NotSerializableException ("No!");

Problemas de la serialización
Cambios en la clase
Por ejemplo añadir/eliminar un campo
Para guardar no hay problema
Al recuperar provocará excepciones:
java.io.InvalidClassException

serialVersionUID
La solución consiste en identificar la clase
Utilizamos serialver o Eclipse
public class Jugador implements Serializable {
private static final long serialVersionUID =
77552270920966258L;

Otros uso de la serialización
RMI
En BBDD
Criptografía

Ejemplo de Cripto
FileOutputStream fos =
new FileOutputStream("out.des");
BufferedOutputStream bos =
new BufferedOutputStream(fos);
CipherOutputStream cos =
new CipherOutputStream(bos, desCipher);
ObjectOutputStream oos =
new ObjectOutputStream(cos);

Más información
Discover the secrets of the Java
Serialization API
http://java.sun.com/developer/technicalArticles/Programming/serialization/
Advanced Serialization
http://java.sun.com/developer/technicalArticles/ALT/serialization/
Interface Serializable
http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html

Caso práctico

Objetivo del caso
Fijar los conocimientos de cada técnica
Comprobar las diferencias entre ellas

Especificaciones generales
Debe posibilitar la visualización y edición
de datos.
Debido a su evolución es recomendable
utilizar un buen diseño

Gestor de Tareas
Tarea
Descripción
Fecha de registro
Persona asignada
Persona
Nombre
Proyecto
Nombre
Notas
Una persona
puede tener
múltiples tareas
Un proyecto tiene
múltiples tareas.

Diseño orientativo

Resumen de Serialización
Ventajas:
Sencillo
Sin dependencias
Inmediato
Flexible
Desventajas:
Rudimentario
Sufre con los
cambios
Sufre con las
corrupciones
No vale para
grandes cantidades
de datos