Curso (y ejercicios) del uso de la serialización como técnica de persistencia en Java.
Size: 716.29 KB
Language: es
Added: May 05, 2011
Slides: 38 pages
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.
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