La serialización en Java permite convertir objetos en una representación binaria para poder almacenarlos o transmitirlos. Implementar la interfaz Serializable es suficiente para serializar la mayoría de objetos. Los objetos compuestos también se pueden serializar siempre que todos sus componentes sean serializables. Es posible extender la serialización para personalizar la conversión. La serialización tiene limitaciones como sufrir problemas ante cambios en las clases o no ser adecuada para grandes volúmenes de datos.
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Persistencia en Java - Serialización
1. Persistencia en JAVA
Serialización
Carlos Hernando Carasol
chernando@acm.org
5 de Mayo de 2011
2. Índice de contenidos
Concepto de serialización
Serialización en Java
Objetos compuestos y complejos
Elementos no serializables
Extendiendo serialización
Limitaciones
3. 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
6. Usos de la serialización
Guardar a f chero
i
Transmitir por red
RMI
En JEE, guardar en la sesión HTTP
7. 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.
8. 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);
}
}
9. 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);
}
}
12. 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
}
13. 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
14. Serializar un objeto compuesto
Añado la clase Inventario a Jugador:
public class Jugador implements Serializable{
String nombre;
Inventario inventario;
…
}
15. Todos han de ser serializable
java.io.WriteAbortedException: writing aborted;
java.io.NotSerializableException: Inventario
16. Solución 1
Nos interesa serializar la estructura
relacionada
public class Inventario implements Serializable {
17. 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.
18. 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.
19. Ejercicio
Añadir la clase Inventario:
dinero, l oat
f
capacidad, entero con valor por defecto 100
peso, entero de tipo transient
Añadir un inventario al jugador.
Modif car el programa para:
i
El jugador parte con dinero 1000.0
Muestre los atributos del Inventario antes de
guardar.
21. 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
22. 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.
26. Ejercicio
Convertir en transient:
Jugador.vida
Inventario.equipo
Guardarlos mediante writeObject
27. 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!");
28. 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
29. serialVersionUID
La solución consiste en identif car la clase
i
Utilizamos serialver o Eclipse
public class Jugador implements Serializable {
private static final long serialVersionUID =
77552270920966258L;
30. Otros uso de la serialización
RMI
En BBDD
Criptografía
31. 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);
32. 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
34. Objetivo del caso
Fijar los conocimientos de cada técnica
Comprobar las diferencias entre ellas
35. Especificaciones generales
Debe posibilitar la visualización y edición
de datos.
Debido a su evolución es recomendable
utilizar un buen diseño
36. Gestor de Tareas
Tarea Notas
Descripción Una persona
Fecha de registro puede tener
múltiples tareas
Persona asignada
Un proyecto tiene
Persona múltiples tareas.
Nombre
Proyecto
Nombre
38. Resumen de Serialización
Ventajas: Desventajas:
Sencillo Rudimentario
Sin dependencias Sufre con los
Inmediato cambios
Flexible Sufre con las
corrupciones
No vale para
grandes cantidades
de datos