Persistencia y Serialización en Java con Archivos

Slides:



Advertisements
Presentaciones similares
Archivos Binarios Usando Serializable. Introducción Utilizar archivos binarios nos ayuda a guardar y leer más fácilmente los datos de archivos. Pero como.
Advertisements

Archivos Contenido: Archivos de Texto Archivos de Acceso Aleatorio
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SCJP 6.0 SEMANA CINCO CONSOLE.
Igor Santos Grueiro. Ahora tenemos datos y datos …
1 Streams en Java Agustín J. González ELO Generalidades Un Stream es simplemente una fuente o destino de bytes. Los streams más comunes son los.
7. Interfaces Herencia múltiple Interfaces Comparable y Comparator
1 Persistencia en Java Agustín J. González ELO-329.
Manejo de Punteros y objetos en memoria dinámica en C++
Persistencia. Persistencia significa trascender en el tiempo y/o en el espacio Un ambiente orientado a objetos debe permitir que los objetos se persistan,
PAQUETES Un paquete es un conjunto de clases, interfaces y subpaquetes relacionados. El paquete define un ámbito de visibilidad: los miembros que no tienen.
1 Streams y Persistencia en Java Agustín J. González ELO-329.
1 Interfaces y Clases Internas ELO-329: Diseño y programación orientados a objetos Agustín J. González.
Agustín J. González ELO-329
2012-BM5A. Introducción Todos los lenguajes de programación son distintos entre si. Sin embargo, pueden ser agrupados según la forma de pensar y estructurar.
Interfaces y Clases Internas ELO329: Diseño y Programación Orientados a Objetos.
Flujos de datos Un flujo es un canal por donde fluyen los datos.
Archivos en Java Unidad III – Programación Orientada a Objetos en Java Programación I
PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento y constructores.
PROGRAMACIÓN ORIENTADA A OBJETOS SEGUNDA UNIDAD: “CLASES, OBJETOS Y MÉTODOS” IRVING YAIR SALAS CHÁVEZ ING. EN SISTEMAS COMPUTACIONALES - ITSLP.
Clases y Objetos en Java
Programación Avanzada
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
EL MUNDO DE LOS OBJETOS PROGRAMANDO EN JAVA.
Clases en C++ Agustín J. González ELO329.
Clases y Objetos en Java
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Manejo de Excepciones Agustín J. González ELO329.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Agustín J. González ELO-329
Clases y Objetos en Java
Polimorfismo y Métodos Virtuales
Programación Orientada a Objetos I Unidad 4 Relaciones entre clases: herencia.
Herencia Agustín J. González ELO329.
Clases en C++ Agustín J. González ELO329.
Manejo de Excepciones Agustín J. González ELO329.
Manejo de Punteros y objetos en memoria dinámica en C++
Programación Orientada a Objetos
Plantillas (Templates)‏
Manejo de Excepciones Agustín J. González ELO329.
Manejo de Excepciones Agustín J. González ELO329.
Manejo de Punteros y objetos en memoria dinámica en C++
Taller de certificación Internacional
Herencia en C++ Agustín J. González ELO329.
Disseny de la persistència Serialització
Manejo de Punteros y objetos en memoria dinámica en C++
Disseny de la persistència Serialització
Streams y Persistencia en Java
Algunas Características de C++ no presentes en C
Templates (en español: Pantillas, modelos, patrones)‏
String, random y stream en java
Paquetes y Documentación en Java
Manejo de Punteros y objetos en memoria dinámica en C++
Manejo de Excepciones en C++
Clases en C++ Agustín J. González ELO329.
Problemas de Strings boolean palindrome(String x) Ej: palindrome(“reconocer”)=true boolean alfabetico(String x) Ej: alfabetico(“hola”)=true,
Manejo de Punteros y objetos en memoria dinámica en C++
Herencia en C++ Agustín J. González ELO329.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Qué es orientación a objeto ?
Agustín J. González ELO-329
Agustín J. González ELO-329
Programación Orientada a Objetos
Templates (en español: Pantillas, modelos, patrones)‏
Herencia Agustín J. González ELO329.
Manejo de Excepciones y otros
Herencia en C++ Agustín J. González ELO329.
Clases y Objetos en Java
Transcripción de la presentación:

Persistencia y Serialización en Java con Archivos Agustín J. González ELO-329 Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Persistencia en Java Un objeto se dice persistente cuando es almacenado en un archivo u otro medio permanente. Un programa puede grabar objetos persistentes y luego recuperarlos en un tiempo posterior. A diferencia de C++ que sólo soporta persistencia a través de bibliotecas propietarias por lo cual su portabilidad y generalidad es limitada, Java se provee un mecanismo de serialización para almacenar objetos en disco. La serialización se obtiene llamando al método writeObject de la clase ObjectOutputStream para grabar el objeto, para recuperarlo llamamos al método readObject de la clase ObjectInputStream. La serialización además de persistencia, se puede usar para transferir objetos desde una máquina a otra a través de un socket (ELO330). Diseño y Programación Orientados a Objetos

Interfaz Serializable Sólo objetos que implementen la interfaz Serializable pueden ser escritos a stream. La clase de cada objeto es codificada incluyendo el nombre de la clase y la firma de la clase (su prototipo) los valores de los sus campos y arreglos, y la clausura de cualquier otro objeto referenciado desde el objeto inicial. Para hacer que un objeto sea serializable, sólo debemos declarar que implementa la interfaz serializable. Nada más. No hay métodos que debamos definir. Por razones de seguridad las clases no son serializable por defecto. por ejemplo, no tiene sentido guardar en archivo una referencia a un archivo abierto. Hay que tener claro el orden y tipo de los objetos almacenados en disco para recuperarlos en el mismo orden. Diseño y Programación Orientados a Objetos

Ejemplo: Empleados serializables Class Employee implements Seralizable {....} Employee staff = new Employee[3]; .... out.writeObject(staff); Luego podemos recuperar el objeto haciendo: Employee[ ] newStaff=(Employee[ ])in.readObject(); Sólo objetos pueden ser serializados con writeObject(). Veamos el ejemplo: ObjectFileTest.java Diseño y Programación Orientados a Objetos

Tratamiento de referencia a objetos Múltiples referencias a un único objeto son codificadas usando un mecanismo de referencias compartidas de modo que el “grafo” de objetos puede ser restaurado con la misma forma original. Los métodos writeObject y readObject se encargan de crear y almacenar un número de “serie” para cada objeto. De este modo objetos ya almacenados no son grabados nuevamente. Supongamos que dada manager tiene una secretaria. Dos manager podrían compartir la secretaria, en este caso tendríamos algo como: Si grabamos staff, no queremos tres secretarias luego sino algo equivalente a esta vista en memoria. staff Employee Name=“Eugenia” Manager Secretary= Manager Secretary= Diseño y Programación Orientados a Objetos

Tratamiento de referencia a objetos Para ello Java utiliza el siguiente algoritmo para serializar (poner número de series). A todos los objetos grabados a discos se les asigna un número de serie. Antes de grabar un objeto a disco se ve si ya ha sido grabado. Si ya ha sido grabado, se graba “lo mismo que el objeto con número de series xxx” Sino, se almacena el objeto. En disco: Serial number=1 type=Employee name=“Eugenia” Employee name=“Eugenia” Serial number=2 type=Manager secretary=objeto 1 Manager secretary= Serial number=3 type=Manager secretary=objeto 1 Manager secretary= Diseño y Programación Orientados a Objetos

Mezcla de objetos serializables y datos básicos Podemos hacerlo por medio de los métodos writeInt, readInt, etc dado que ObjectOutputStream implementa la interfaz DataOutput. Análogo para la entrada. De datos. Ejemplo: para escribir un objeto, FileOutputStream ostream = new FileOutputStream("t.tmp"); ObjectOutputStream p = new ObjectOutputStream(ostream); p.writeInt(12345); p.writeObject("Today"); p.writeObject(new Date()); p.flush(); ostream.close(); La lectura se hace en forma análoga. FileInputStream istream = new FileInputStream("t.tmp"); ObjectInputStream p = new ObjectInputStream(istream); int i = p.readInt(); String today = (String)p.readObject(); Date date = (Date)p.readObject(); istream.close(); Diseño y Programación Orientados a Objetos

Cuando hay objetos no serializables Clases que requieren manejos especiales durante el proceso de serialización o deserialización deben implementar los métodos: private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; private void writeObject(java.io.ObjectOutputStream stream) throws IOException Se aplica en casos que tengamos objetos que no sean serializables (aquellos que tienen algún dato no serializable) Por ejemplo Point2D.Double no es serializable en Java. Para que no reclame el compilador, definimos nuestro dato Point2D.Double como transiente (transient) y luego definimos los métodos indicados. Diseño y Programación Orientados a Objetos

Cuando hay objetos no serializables Ejemplo: public class LabelPoint { .... Private String label; private transient Point2D.Double point; } Luego implementamos: private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); out.writeDouble(point.getX()); out.writeDouble(point.getY()); } private void readObject(ObjectInutStream in) throws IOException { in.defaultReadObject(); double x=in.readDouble(); double y=in.writeDouble(); point =new Point2D.Double(x,y); } Diseño y Programación Orientados a Objetos