CAPÍTULO II - SERIALIZACIÓN: PERSISTENCIA DE DATOS EN JAVA



Documentos relacionados
GUÍA RÁPIDA DE TRABAJOS CON ARCHIVOS.

Correspondencias entre taxonomías XBRL y ontologías en OWL Unai Aguilera, Joseba Abaitua Universidad de Deusto, EmergiaTech

CAPITULO 4. Requerimientos, Análisis y Diseño. El presente capítulo explica los pasos que se realizaron antes de implementar

Programación Orientada a Objetos con Java

Curso de JavaServer Faces

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Estructuras de Control - Diagrama de Flujo

Programación Orientada a Objetos en Java

19. Packages o paquetes

Creación y administración de grupos de dominio

Curso de Java POO: Programación orientada a objetos

Sistemas de Información 12/13 XML (extensible Mark-up Language)

Presentaciones. Con el estudio de esta Unidad pretendemos alcanzar los siguientes objetivos:

Entre los más conocidos editores con interfaz de desarrollo tenemos:

10. El entorno de publicación web (Publiweb)

Toda base de datos relacional se basa en dos objetos

Sesión No. 4. Contextualización INFORMÁTICA 1. Nombre: Procesador de Texto

Introducción a la Firma Electrónica en MIDAS

GUÍA Nro. 1 TECNOLOGÍA DE INTERNET. TIII PIII

PROGRAMACIÓN ORIENTADA A OBJETOS Master de Computación. II MODELOS y HERRAMIENTAS UML. II.2 UML: Modelado de casos de uso

Leer XML con XMLReader en el aula

Capítulo 1 Documentos HTML5

TEMA 2. CARACTERÍSTICAS DEL LENGUAJE VISUAL BASIC

Propuesta de Portal de la Red de Laboratorios Virtuales y Remotos de CEA

Soporte y mantenimiento de base de datos y aplicativos

Autor: Microsoft Licencia: Cita Fuente: Ayuda de Windows

JAVA EE 5. Arquitectura, conceptos y ejemplos.

GENERACIÓN DE ANTICIPOS DE CRÉDITO

Tema 4. Gestión de entrada/salida

Proyecto MONO. Juantomás García. 1. Introducción. GNOME Hispano

Curso de Python Inicial

Capítulo VI. Estudio de Caso de Aplicación del Integrador de Información Desarrollado

Consultas con combinaciones

COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA

Programación Orientada a Objetos. Tema 7: Persistencia

WINDOWS : COPIAS DE SEGURIDAD

GENERACIÓN DE TRANSFERENCIAS

App para realizar consultas al Sistema de Información Estadística de Castilla y León

Introducción. Componentes de un SI. Sistema de Información:

Modelo de Objetos Distribuidos

Maxpho Commerce 11. Gestión CSV. Fecha: 20 Septiembre 2011 Versión : 1.1 Autor: Maxpho Ltd

GLOSARIO. Arquitectura: Funcionamiento, estructura y diseño de una plataforma de desarrollo.

Arquitectura de sistema de alta disponibilidad

Acronis License Server. Guía del usuario

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

CAPÍTULO IV - DESARROLLO DEL SISTEMA

Introducción al lenguaje de programación java

Programación orientada a objetos

Novedades en Q-flow 3.02

(PHP y APACHE), y el programa de comunicación Skype, para controlar de manera

Elementos requeridos para crearlos (ejemplo: el compilador)

TEMA 2 WINDOWS XP Lección 4 BLOC DE NOTAS

Tema 1. Introducción a JAVA

Manual para la utilización de PrestaShop

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

Apéndice 5 Manual de usuario de ColeXión. ColeXión 1.0. Manual de usuario

La interoperabilidad se consigue mediante la adopción de estándares abiertos. Las organizaciones OASIS y W3C son los comités responsables de la

SiteAudit Knowledge Base Programación de Reportes en SiteAudit

Internet Information Server

Departamento CERES Área de Tarjetas Inteligentes Manual de Usuario

Ventajas del almacenamiento de correo electrónico

Capitulo III. Diseño del Sistema.

Person IP CRM Manual MOBILE

extensible Markup Language

Capítulo 1 Introducción a la Computación

GUIA COMPLEMENTARIA PARA EL USUARIO DE AUTOAUDIT. Versión N 02 Fecha: 2011-Febrero Apartado: Archivos Anexos ARCHIVOS ANEXOS

Ajustes del Curso en egela (Moodle 2.5)

Patrones para persistencia (I) Ingeniería del Software II

toda la potencia de un Dedicado con la flexibilidad del Cloud

Descubra las novedades de EasyProf 3.0! Cambios en la filosofía de trabajo

Mi propuesta consiste en crear un portal Web que contemple las siguientes funcionalidades:

Configuración servidor Tomcat

Estructuras de Sistemas Operativos

DOCUMENTACIÓN TÉCNICA

Estructuras de Control - Diagrama de Flujo

INFORMÁTICA APLICADA A LA GESTIÓN COMERCIAL LECCIONES DE OFIMÁTICA BÁSICA: GUIA BÁSICA DE MS - POWER POINT

ESTÁNDAR DESEMPEÑO BÁSICO Recopila información, la organiza y la procesa de forma adecuada, utilizando herramientas tecnológicas.

TABLA DE DECISION. Consideremos la siguiente tabla, expresada en forma genérica, como ejemplo y establezcamos la manera en que debe leerse.

arquitectura que maneja. Encontraremos también los diferentes servidores que

Tipos de conexiones de red en software de virtualizacio n: VirtualBox y VMware

Capítulo I. Definición del problema y objetivos de la tesis. En la actualidad Internet se ha convertido en una herramienta necesaria para todas

A continuación resolveremos parte de estas dudas, las no resueltas las trataremos adelante

Proceso de cifrado. La fortaleza de los algoritmos es que son públicos, es decir, se conocen todas las transformaciones que se aplican al documento

1. INTRODUCCIÓN Y OBJETIVOS

DIAGRAMA DE CLASES EN UML

MANUAL COPIAS DE SEGURIDAD

Instantáneas o Shadow Copy

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Manual de uso de la plataforma para monitores. CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib

Información del Producto: XenData X2500 LTO-6 Digital Video Archive System

BASES DE DATOS OFIMÁTICAS

Requisitos mínimos. ANEXO I: Certificado digital

Sistema informatizado de Trazabilidad alimentaria

M III ABSTRACCIÓN Y CLASIFICACIÓN

Nociones básicas de Windows: Organizando: El Explorador de archivos de Windows

Manual de usuario para Android de la aplicación PORTAFIRMAS MÓVIL

Contenido Derechos Reservados DIAN - Proyecto MUISCA

Transcripción:

CAPÍTULO II - SERIALIZACIÓN: PERSISTENCIA DE DATOS EN JAVA 14

2.1 Introducción En este capítulo se explica el mecanismo de serialización usado en EAPI para permitir la persistencia de objetos entre ejecuciones del programa. Se muestra cómo se almacena, se restaura y se reutiliza un proyecto. 2.2 Definición de serialización Hoy en día existen diversos tipos de persistencia, sin embargo, en la plataforma Java uno de los más usados es el mecanismo conocido como serialización, definida en [García, 1999] como: un proceso por el que un objeto cualquiera se puede convertir en una secuencia de bytes con la que más tarde se podrá reconstruir el valor de sus variables. Esto permite guardar un objeto en un archivo o mandarlo por la red. Posteriormente, es posible deshacer la serialización volviendo a crear el objeto mediante la lectura de su estado a partir del almacenamiento o de la red. Es necesario mencionar que una de las formas más habituales de implementar la persistencia a partir de almacenamiento es la utilización de bases de datos relacionales. Las bases de datos relacionales han ofrecido por años un modo seguro, escalable y eficiente de almacenar los datos. Venus utiliza este sistema para almacenar los datos de los proyectos. 15

2.3 Usando la serialización de objetos Mahmoud explica que para serializar un objeto, este debe implementar la interfaz java.io.serializable, en caso contrario, no se podrá hacer la serialización del objeto. La interfaz Serializable no tiene métodos, sólo es usada para informar a la JVM (Java Virtual Machine) que un objeto va a ser serializado. Además del propio objeto que va a ser serializado, también se debe usar un I/O Stream, es decir, una clase que implementa un flujo de entrada/salida. Para salvar objetos por medio de la serialización se debe crear una instancia de un ObjectOutputStream, el cual es una subclase de OutputStream. Como ejemplo, el siguiente código muestra cómo guardar un String serializado en un archivo [Mahmoud, 2000]: FileOutputStream fos = new FileOutputStream( str.out ); ObjectOutputStream oos = new ObjectOutputStream(fos); Oos.writeObject( Este String ha sido guardado ); El método writeobject es usado para guardar un objeto a través de un flujo de salida. Este método puede ser llamado cualquier número de veces para salvar objetos. Sin embargo, el objeto pasado a writeobject debe implementar la interfaz Serializable. 16

La lectura de objetos salvados es trivial. En el siguiente ejemplo se muestra cómo leer un objeto, en este caso se trata de un String serializado guardado anteriormente [Mahmoud, 2000]. FileInputStream fis = new FileInputStream( str.out ); ObjectOutputStream ois = new ObjectOutputStream(fis); Object o = ois.readobject(); Al igual que con writeobject, readobject puede ser llamado cualquier número de veces y leer cualquier número de objetos desde el flujo de entrada. Cuando se leen objetos desde un flujo, se debe tener presente qué tipo de objetos son esperados en el flujo, es decir, se han de leer en el mismo orden en que fueron guardados. 2.4 Serialización en EAPI Si se trabaja en diversas computadoras con EAPI, éstas pueden tener diferentes versiones de Java (versiones 1.4.0_00 y 1.5.0_01, por ejemplo), por lo que la implementación de las clases de las librerías de Java puede ser diferente y por lo tanto, ser incompatibles entre sí en lo que respecta a serialización. En [Sun Java 1.3 serialización, 1999] se enumeran los casos que provocan incompatibilidad de versiones entre diferentes versiones de una misma clase. Para mayor información sobre el tema, véase el Apéndice A. 17

Tal y como aparece en [Sun Java 1.4 Swing, 2003], Sun no garantiza que los objetos Swing serializados usando esta versión de Java sean compatibles con las futuras versiones de Java: Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, support for long term storage of all JavaBeansTM has been added to the java.beans package. Please see XMLEncoder El párrafo anterior menciona que si un proyecto fue creado con una versión de máquina virtual de Java (JVM) diferente a la que se cuenta a la hora de recuperarlo, no se garantiza la compatibilidad de versiones. Esto es precisamente lo que sucede cuando salvamos un proyecto de Venus desde la versión 1.4.2_02 en Solaris y luego la intentamos abrir con la versión 1.5.0_00 desde Windows (y viceversa). Si esos mismos proyectos los abrimos con la misma máquina virtual de Java con la que fueron creados, entonces no se produce ningún error. En el Apéndice B se muestran algunas ejecuciones donde se puede comprobar el tipo de error que muestra la JVM al querer ejecutar la aplicación en diferentes computadoras. Se quiere solucionar el problema de las versiones de serialización mediante el empleo de XML para almacenar la información de los diagramas generados. A continuación se mostrarán las ventajas que aporta esta aproximación alternativa. 18

2.5 XML: persistencia de datos en Java 2.5.1 Introducción a XML El estándar XML (Extensible Markup Language) es un formato de texto simple y muy flexible derivado de SGML (Standard Generalizad Markup Language). XML fue diseñado para describir datos y actualmente tiene mucha importancia en el intercambio de una gran variedad de datos en el Web. Existe una gran variedad de parsers XML que están disponibles para simplificar la creación y el consumo de documentos XML en prácticamente cada plataforma moderna. XML es ligero y presenta herramientas de soporte que bien pueden ser utilizadas en EAPI para el almacenamiento y recuperación de proyectos, por tanto, la codificación en XML permitirá la compatibilidad de la Serialización (bajo cualquier plataforma) sin importar la versión de Java usada. Para describir la estructura de un documento XML se puede usar un esquema. Las dos tecnologías dominantes para definir un esquema XML son Document Type Definition (DTDs) y XML Schema. 2.5.2 DTD y XML Schema Los DTDs (Document Type Definition) se usan para definir la estructura del documento XML, pero no sirven para describir el contenido del documento. A continuación se mencionan otras características de los DTDs: 19

Establecen las restricciones para un conjunto de documentos. Definen la manera en que los documentos deben ser construidos. Permiten que otras aplicaciones interpreten nuevas etiquetas. Permiten la transferencia de datos entre aplicaciones. Definen el orden y el anidamiento de las etiquetas. Otra manera recomendada para crear esquemas es XML Schema. XML Schema no sólo permite definir la estructura de un documento XML, sino que también define el tipo de datos que el documento contiene y cualquier restricción sobre los datos. 2.6 XML como formato para hacer persistentes los objetos Java Como se explica en [Thornton, 2002], no fue hasta el lanzamiento de Java 2 Standard Edition versión 1.4 (J2SE v1.4) cuando los objetos Java se pudieron serializar como documentos XML. Con versiones anteriores a la versión 1.4 los objetos de Java se podían serializar solamente usando un formato binario (mediante la interfaz Serializable). Java ofrece la clase java.beans.xmlencoder para permitir la persistencia de objetos como documentos XML. Esta clase se encarga de convertir el objeto y todos sus datos (incluidos los campos que también son objetos) a un documento XML. Como principales ventajas (explicadas en [Sun Java 1.4 XMLEncoder, 2003]) podemos enumerar las siguientes: 20

Soporta cambios en las versiones: los objetos persistentes no tienen dependencias con implementaciones privadas de ninguna clase y, por tanto, al igual que los ficheros fuente de Java, pueden ser intercambiados entre entornos que tienen versiones diferentes de algunas de las clases o incluso máquinas virtuales de diferentes vendedores. Estructuralmente compacto: la clase XMLEncoder usa internamente un algoritmo de eliminación de redundancia para que los valores por defecto de las propiedades de un JavaBean no sean escritos al flujo (para más información sobre la descripción de JavaBeans ver el Apéndice C). Tolerante a fallas: los errores no estructurales en el archivo, causados por daños al archivo o por cambios de API hechos a la clase permanecen localizados, por tanto, el lector puede reportar el error y continuar cargando partes del documento que no se ven afectadas por el error. En principio, esta clase está pensada para JavaBeans pero tal y como se muestra en [Milne, 2003] es posible adaptar la clase XMLEncoder mediante delegados de persistencia con el fin de serializar como XML cualquier tipo de clase Java. Un delegado de persistencia es una clase Java que permite representar el estado de una instancia de una clase en términos del API público de dicha clase [Sun Java 1.4 PersistenceDelegate]. 21

En nuestro contexto, un delegado de persistencia es una clase Java que crea representaciones del estado del objeto en XML. Java facilita un delegado de persistencia por defecto, pero exige que los objetos cumplan con una parte de la especificación de los JavaBeans: ofrecer un constructor sin argumentos. exponer las propiedades que constituyen el estado del objeto usando métodos get/set. independencia entre las propiedades (que no haya efectos colaterales al llamar a los métodos get/set de dos propiedades distintas). Por tanto, una alternativa es hacer que las clases a serializar sigan las convenciones de los JavaBeans. Si esto no fuera posible, también existe la posibilidad de usar la clase BeanInfo, que permite especificar el acceso a los campos de la clase. Por ejemplo, indicar a XMLEncoder que no es necesario serializar el valor de cierto campo, pues no es importante para el estado del objeto o especificar qué método emplear para establecer (set) el valor de un campo cuando se quiera recuperar la información con XMLDecoder (la clase que se encarga de deserializar los documentos XML generados por XMLEncoder). Ejemplo: La clase Font tiene este constructor: Font( String name, int style, int size ) 22

Es decir, necesita parámetros y por tanto no cumple las restricciones del delegado de persistencia que XMLEncoder usa por defecto. Para remediar esta situación se usa un delegado de persistencia propio: XMLEncoder e = new XMLEncoder(System.out); e.setpersistencedelegate(font.class, new DefaultPersistenceDelegate( new String[]{ "name", "style", "size" }) ); e.writeobject(new Font(... )); En el documento anteriormente citado [Milne, 2003] se muestra código para otros casos en los que también se hace necesario crear delegados de persistencia propios. 2.6.1 Uso de XMLEncoder La clase XMLEncoder se puede utilizar para crear un documento XML que describa el estado de un componente JavaBean, de igual manera que la clase ObjectOutputStream se usa para crear archivos binarios que representan objetos serializables. El siguiente código [Sun Java 1.4 XMLEncoder, 2003] crearía un documento XML llamado "Test.xml": 23

XMLEncoder e = new XMLEncoder( new BufferedOutputStream( new FileOutputStream("Test.xml"))); e.writeobject(new JButton("Hello, world")); e.close(); XMLEncoder trabaja reproduciendo el grafo del objeto y registrando los pasos que fueran necesarios para crear la copia. De esta manera XMLEncoder tiene una copia de trabajo del grafo del objeto que imita los pasos que XMLDecoder tomaría para descifrar el archivo. Supervisando el estado de esta copia de trabajo, el codificador puede omitir las operaciones que fijarían valores de característica a su valor prefijado, elaborando documentos breves con poca información redundante [Sun Java 1.4 XMLEncoder, 2003]. 2.6.2 Cómo XMLEncoder utiliza delegados de persistencia A diferencia de ObjectOutputStream, cuyos métodos writeobject() están contenidos en las clases que se escriben en el flujo, es posible especificar la manera en que los objetos de una clase dada son codificados por un objeto XMLEncoder. XMLEncoder contiene un conjunto de PersistenceDelegates, organizados según la clase del objeto que codifican. Este mapa interno, de la clase al delegado de la persistencia, puede ser consultado y modificado por el usuario para cambiar la manera en que el codificador maneja clases particulares cuando las encuentra como parte de un grafo que está codificando [Sun Java 1.4 XMLEncoder, 2003]. 24

Para conocer mejor los detalles de cómo hacer esto, véase el método setpersistencedelegate() de java.beans.encoder. El punto público y único de entrada para un PersistenceDelegate es su método writeobject(), XMLEncoder hace poco más que buscar el delegado de persistencia apropiado para la clase del objeto que es escrito y después llamar a su método writeobject(). 2.6.3 Ejemplo de un documento XML generado por XMLEncoder XMLEncoder genera documentos XML como esta representación de un yoghurt (basada en el ejemplo de [Thornton, 2002]): <?xml version="1.0" encoding="utf-8"?> <java version="1.4.0" class="java.beans.xmldecoder"> <object class="yoghurt"> <void property= peso"> <int>20</int> </void> <void property="sabor"> <string>vainilla</string> </void> </object> </java> En este ejemplo se representa un objeto Yoghurt con dos atributos: sabor y peso. Los valores de dichos atributos para esta instancia de Yoghurt son, respectivamente, 20 (gramos) y vainilla. 25

O este otro [Persistente of JavaBeans, 2003] que representa un JPanel de Swing con dos objetos anidados: <object class="javax.swing.jpanel"> <void method="add"> <object id="button1" class="javax.swing.jbutton"/> </void> <void method="add"> <object class="javax.swing.jlabel"> <void method="setlabelfor"> <object idref="button1"/> </void> </object> </void> </object> El anterior documento XML generaría el siguiente código Java cuando XMLDecoder lo interpretara: JPanel panel1 = new JPanel(); JButton button1 = new JButton(); JLabel label1 = new JLabel(); panel1.add(button1); panel1.add(label1); label1.setlabelfor(button1); 26

Y por tanto, se recrearía el objeto JPanel inicial. La forma en que XMLEncoder serializa los objetos Java como XML está definida mediante XML Schema y puede consultarse un artículo al respecto en [Milne, 2003]. Todos los documentos generados por XMLEncoder siguen el mismo XML Schema. 2.7 Conclusiones La serialización XML proporcionada por XMLEncoder permite sustituir la serialización binaria de Java por un método más flexible ante los cambios de implementación, independiente de la versión de Java que se utilice. 27