Persistencia en Java - Serialización
-
Upload
carlos-hernando -
Category
Technology
-
view
15.479 -
download
6
description
Transcript of Persistencia en Java - Serialización
Índice de contenidos
Concepto de serializaciónSerialización en JavaObjetos compuestos y complejosElementos no serializablesExtendiendo serializaciónLimitaciones
Serialización: concepto
“... is the process of converting a data structure or object into a format that can be stored” WikipediaAplanar estructuras… en un formato que pueda reconstruir
Un ejemplo
Otros ejemplos
XMLJSON
Usos de la serialización
Guardar a fi cheroTransmitir por redRMIEn JEE, guardar en la sesión HTTP
Serialización en Java
Se utiliza el interfaz SerializableNo requiere implementación de ningún tipoPuede 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
ObjectOutputStreamoos.writeObject(jugador)Solamente es necesario que jugador implemente Serializable
Exterior → Objeto
ObjectInputStreamJugador jugador = (Jugador) ois.readObject()Es necesario que jugador implemente SerializableEs 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, cadenavida, 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 temporalNo tiene atributos, por ejemplo un controladorEl atributo no debería ser persistido, por ejemplo un Thread o un Socket.
Ejercicio
Añadir la clase Inventario:dinero, fl oatcapacidad, entero con valor por defecto 100peso, entero de tipo transient
Añadir un inventario al jugador.Modifi car el programa para:
El jugador parte con dinero 1000.0Muestre los atributos del Inventario antes de guardar.
Serializar estructuras complejas
En Java los Collections son serializables
Deep / Shallow copy
Profundidad de la copiaSerializable � 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, stringcantidad, entero positivopeso (por unidad), entero positivo
Añadimos una lista de equipo al inventarioMostramos la lista de todo el equipo.
Ampliar métodos de serialización
private void writeObject(java.io.ObjectOutputStream out) throws IOExceptionprivate 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.vidaInventario.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 clasePor ejemplo añadir/eliminar un campo
Para guardar no hay problemaAl recuperar provocará excepciones:java.io.InvalidClassException
serialVersionUID
La solución consiste en identifi car la claseUtilizamos serialver o Eclipse
public class Jugador implements Serializable {
private static final long serialVersionUID = 77552270920966258L;
Otros uso de la serialización
RMIEn BBDDCriptografí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 Serializationhttp://java.sun.com/developer/technicalArticles/ALT/serialization/
Interface Serializablehttp://download.oracle.com/javase/6/docs/api/java/io/Serializable.html
Caso práctico
Objetivo del caso
Fijar los conocimientos de cada técnicaComprobar 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
TareaDescripciónFecha de registroPersona asignada
PersonaNombre
ProyectoNombre
NotasUna persona puede tener múltiples tareasUn proyecto tiene múltiples tareas.
Diseño orientativo
Resumen de Serialización
Ventajas:SencilloSin dependenciasInmediatoFlexible
Desventajas:RudimentarioSufre con los cambiosSufre con las corrupcionesNo vale para grandes cantidades de datos