Download Presentación de PowerPoint - Departamento de Ingeniería Telemática
Document related concepts
no text concepts found
Transcript
Representación externa de datos y Serialización Marisol García Valls Arquitecturas Distribuidas 2º Ingeniero de Telecomunicación (Telemática) Departamento de Ingeniería Telemática Universidad Carlos III de Madrid mvalls@it.uc3m.es 2 Índice • Introducción a la comunicación remota • Formato de representación externa de datos • Empaquetado de datos (marshaling) • Serialización de objetos de Java • El mecanismo de reflexión • Temas relacionados: – Referencias a objetos remotos • Bibliografía: G. Coulouris, et al. “Sistemas distribuidos. Conceptos y diseño”. 3ª ed. (o posterior). Addison-Wesley 2001. CAPÍTULO 4. ©2009 Marisol García Valls Arquitecturas Distribuidas Comunicación remota 3 mobjCliente () { . . . x = objetoRemoto.m1(a,b,c); . . . } 0100011101001 • La información en los programas en ejecución se representa como estructuras de datos (objetos interconectados) • En los mensajes, la información consiste en secuencias de bytes. ©2009 Marisol García Valls Arquitecturas Distribuidas Formato externo de representación de datos 4 • Las estructuras de datos (ED’s) deben ser aplanadas (convertidas a una secuencia de bytes) para su transmisión. • El orden de almacenamiento de valores primitivos, como los enteros, puede diferir en computadores distintos: big-endian o little endian. • La representación de los números de coma flotante también puede diferir. • Los códigos para representación de caracteres puede ser ASCII (Unix) o Unicode. • Para permitir el intercambio de valores de datos entre dos computadores, los valores podrán: – convertirse a un formato externo de representación acordado antes de la transmisión. – transmitirse en el formato del emisor, junto con la indicación del formato usado. • La representación externa de datos es un estándar acordado para la codificación de estructuras de datos y valores primitivos. ©2009 Marisol García Valls Arquitecturas Distribuidas Empaquetado 5 • Empaquetado (marshalling) es el proceso de tomar un conjunto de datos y ensamblarlos en una forma adecuada para ser transmitida en un mensaje. • Desempaquetado (unmarshalling) consiste en el desensamblaje en el punto de recepción para producir una colección equivalente de datos. • Por tanto, el empaquetado consiste en la traducción de elementos de datos estructurados y valores primitivos a una representación externa de datos. • El empaquetado permite: – trabajar con los parámetros y resultados de invocaciones remotas, – conversión de ED’s u objetos a formas adecuadas para transmisión de mensajes, y – conversión de ED’s u objetos a formas adecuadas para almacenamiento en disco. ©2009 Marisol García Valls Arquitecturas Distribuidas 6 CORBA CDR y Serialización de JAVA • Existen dos aproximaciones al empaquetado y representación externa de datos: – Representación común de datos de CORBA (CORBA CDR): transmisión de argumentos y resultados. – Serialización/secuenciación de objetos de Java (serialization): transmisión de argumentos y resultados y almacenamiento en disco. • En ambos casos, el des/empaquetado es realizado por el middleware sin intervención de la aplicación. • En ambos casos, los tipos de datos primitivos se empaquetan a forma binaria. • Una forma alternativa de empaquetado consistiría en empaquetar a texto ASCII (HTTP). • El empaquetado ASCII es simple de implementar pero produce unos datos de mayor tamaño. ©2009 Marisol García Valls Arquitecturas Distribuidas Serialización de objetos en Java 7 • Actividad para aplanar un objeto o un conjunto de objetos relacionados a un formato secuencial adecuado para almacenamiento en disco o transmisión en un mensaje. • Deserialización consiste en restablecer el estado de un objeto o conjunto de objetos a partir de su forma serializada. • Se pueden pasar como argumentos y resultados tanto valores de tipos primitivos como objetos. • Para que una clase sea serializable debe implementar la interfaz Serializable. public class Persona implements Serializable { private String nombre, lugar; private int anno; public Persona(String uNombre, String uLugar, int uAnno){ nombre = uNombre; lugar = uLugar; anno = uAnno; } // Métodos para acceder a las variables de instancia } ©2009 Marisol García Valls Arquitecturas Distribuidas Información de serialización 8 • El proceso de deserialización no tiene conocimiento previo de los tipos de los objetos de la forma serializada. • Se necesita incluir información sobre la clase de cada objeto en la forma serializada. • Ello permitirá al receptor cargar las clases necesarias al serializar objetos. • Información en la serialización de un objeto: Nombre Versión Número, tipo y nombre de variables instancia Valores de variables instancia Info. de la clase • El número de versión cambia cuando la clase sufre modificaciones sustanciales. • Puede establecerlo el programador o ser calculado como el hash del nombre, variables de instancia, métodos e interfaces. • El proceso de deserialización comprueba si tiene la versión adecuada de la clase. ©2009 Marisol García Valls Arquitecturas Distribuidas 9 Serialización recursiva • Los objetos de Java pueden contener referencias a otros objetos. • Cuando se serializa un objeto todos los objetos a los que mantiene referencias son también serializados. • Al reconstruir los objetos en el destino, todas sus referencias podrán ser resueltas. • Las referencias son serializadas como apuntadores (handles). • Un apuntador es una referencia a un objeto en la forma serializada. • Deberá existir una correspondencia 1 a 1 entre referencias a objetos y apuntadores. • Cada objeto deberá ser escrito sólo una vez. En sus posteriores ocurrencias se escribirá el apuntador. • Si las variables de instancia pertenecen a clases nuevas, su información de clase deberá ser escrita también, seguida de los nombres y tipos de sus variables de instancia. • Cada clase tiene un apuntador de forma que sólo se escribe una vez al stream de bytes. • Por lo tanto, es un proceso recursivo. ©2009 Marisol García Valls Arquitecturas Distribuidas 10 Más datos sobre la serialización de Java • Los contenidos de las variables que son tipos primitivos (enteros, caracteres, booleanos, bytes y longs) se escriben en un formato binario portable. • Para ello se usan métodos de la clase ObjectOutputStream (writeObject). • Los strings y caracteres se escriben usando el Formato Universal de Transferencia (UTF), con el método writeUTF. • En UTF los caracteres ASCII se representan con un byte y Unicode con múltiples bytes. • Los strings van precedidos del número de bytes que ocupan en el stream. • Como ejemplo, véase la forma serializada del siguiente objeto: Persona p = new Persona(“Paco”, “Valencia”, 1909); Persona ©2009 Marisol García Valls Nº versión de 8 bytes 3 int anno java.lang.String nombre 1909 4 Paco 8 Valencia h0 java.lang.String lugar h1 Arquitecturas Distribuidas 11 Utilización del mecanismo de serialización • Para serializar un objeto: – se crea una instancia de la clase ObjectOutputStream, – se invoca su método writeObject, con el objeto a serializar como argumento. • Para deserializar un objeto de un stream de datos: – se abre un ObjectInputStream sobre el stream en cuestión, – se usa su método readObject para reconstruir el objeto original. ©2009 Marisol García Valls Arquitecturas Distribuidas 12 Cambios en la serialización • El mecanismo de serialización y deserialización es llevado a cabo por el middleware sin intervención de la aplicación. • Puede necesitarse características especiales en la serialización que obliguen a modificarla. • Para modificar la serialización se puede cambiar la implementación de los métodos de de/serialización. • Pueden también declararse variables que no deban ser serializadas con el modificador transient. • Ejemplos de objetos que no deban ser serializados son: sockets, ficheros locales, claves, etc. ©2009 Marisol García Valls Arquitecturas Distribuidas 13 El mecanismo de reflexión (reflection) • La reflexión consiste en la habilidad de preguntar sobre las propiedades de una clase (nombres y tipos de sus atributos y métodos). • Esto hace posible crear clases a partir de sus nombres y crear un constructor para una clase dada con los argumentos dados. • La reflexión permite hacer serialización y deserialización de una manera totalmente genérica. • Por tanto, no hace falta generar funciones de empaquetado especiales para cada tipo de objeto (como sí es el caso en CORBA). • La serialización de Java usa reflexión para: – • averiguar el nombre de la clase del objeto a serializar y los nombres, tipos y valores de sus atributos. La deserialización en Java usa reflexión para: – crear una clase a partir del nombre de la clase de la forma serializada; – esto se usa para crear un nuevo constructor con los tipos de argumentos correspondientes a los especificados en la forma serializada; – el constructor se usa para crear un objeto con los atributos cuyos valores vienen en la forma serializada. ©2009 Marisol García Valls Arquitecturas Distribuidas 14 Referencias a objetos remotos • Un objeto remoto vive sólo en el proceso que lo ha creado y muere al morir éste. • Las invocaciones a métodos remotos se transmiten a través de mensajes que contienen la información necesaria (nombre del método, parámetros, valor de retorno, etc.). • Además, en una invocación remota se necesita especificar el objeto remoto sobre el que se quiere ejecutar ese método. • Una referencia a objeto remoto (RR) es un identificador para un objeto que reside en algún lugar de la red; esta referencia es válida a lo largo y ancho del sistema distribuido. • En la invocación remota se pasa una referencia al objeto remoto sobre el que se va a realizar la invocación de ese método. • Las referencias remotas son pasadas como argumentos y devueltas como resultados. • Cada objeto remoto tiene una única RR. • Las RR pueden ser comparadas para averiguar si hacen referencia al mismo objeto remoto. • Las RR no deben ser reutilizadas; puede haber invocantes que mantengan RR obsoletas. ©2009 Marisol García Valls Arquitecturas Distribuidas 15 Representación externa de las referencias remotas • Las RR deben ser generadas de forma que se asegure su carácter único. • Una forma de asegurar RR únicas es construyéndolas por concatenación con los datos: 32 bits 32 bits 32 bits 32 bits Dirección Internet Nº de puerto Hora Nº de objeto Interfaz de objeto remoto • El número de puerto es el del proceso/hilo que creó el objeto. • El número de objeto se incrementa cada vez que se crea un nuevo objeto en ese proceso. • El nº de puerto y nº de objeto constituyen un identificador único para el proceso en esa máquina. • La interfaz es relevante para cualquier proceso que reciba una RR como argumento o resultado de una invocación remota. • La interfaz permite saber los métodos ofrecidos por el objeto remoto. ©2009 Marisol García Valls Arquitecturas Distribuidas