Programación en castellano Añadir una dirección | Buscador | Cursos | Artículos | Foros | Formación

Sistema de Nombrado en Java (JNDI) [Parte I]
Autor: Sun
Traductor: Juan Antonio Palos (Ozito)


En esta página:


Objetos Serializables

Serializar un objeto significa convertir su estado a un stream de bytes de forma que este stream de bytes pueda ser invertido para crear una copia del objeto. Un objeto Java es Serializable si su clase o alguna de sus superclases implementan el inteface java.io.Serializable o su subinterface, java.io.Externalizable. Des-serialización es el proceso de convertir la forma serializada de un objeto en una copia del propio objeto.

Por ejemplo, la clase java.awt.Button del AWT implementa el interface Serializable, por eso podemos serializar un objeto java.awt.Button y almacenar ese estado serializado en un fichero. Posteriormente, podemos leer el estado y des-serializarlo en un objeto java.awt.Button.

La plataforma Java especifica una forma por defecto en la que se serializan los objetos serializables. Una clase (Java) puede sobreescribir su serialización por defecto y definir su propia forma de serializar objetos de esa clase. La Especificación de Serialización de Objetos describe en detalle la serialización de objetos.

Cuando un objeto es serializado, la información que identifica su clase se almacena en el stream serializado. Sin embargo, la definición de la clase ("el fichero class") no es almacenado. Es responsabilidad del sistema que des-serializa un objeto determinar cómo localizar o cargar los ficheros class necesarios. Por ejemplo, una aplicación Java podría incluir un fichero JAR en su classpath que contenga ficheros class de objetos serializados o cargar las definiciones de las clases usando información almacenada en el directorio, como se explica más adelante en esta lección.

Unir un Objeto Serializable

Podemos almacenar un objeto serializable en el directorio si el proveedor de servicios soporta esta acción, como lo hace el proveedor de servicio LDAP de Sun.

El siguiente ejemplo llama a Context.bind() para unir un botón AWT con el nombre "cn=Button".

Para asociar los atributos con la nueva unión, usamos DirContext.bind().

Para sobreescribir una unión existente, usamos Context.rebind() y DirContext.rebind().

// Create the object to be bound
Button b = new Button("Push me");

// Perform the bind
ctx.bind("cn=Button", b);

Podemos leer el objeto de nuevo usando Context.lookup(), de esta forma.

// Check that it is bound
Button b2 = (Button)ctx.lookup("cn=Button");
System.out.println(b2);

Al ejecutar este ejemplo se produce la siguiente salida.

# java SerObj
java.awt.Button[button0,0,0,0x0,invalid,label=Push me]

Especificar un Codebase

Nota:

Los prodecimientos descritos aquí son para uniones de unobjeto serializable en un servicio de directorio que sigue el esquema definido en la RFC 2713. Estos procedimientos podrían no ser aplicables de forma generalizada a otros servicios de nombres y directorios que soporten unir un objeto serializble con un codebase específico.

Cuando un objeto serializable se une a un directorio como se vió en el ejemplo anterior, las aplicaciones que lean el objeto serialiable desde el directoio deben tener necesariamente acceso a las definiciones de las clases para des-serializar el objeto. De forma altenativa, podemos grabar un coebase con el objeto serializado en el directorio, cuando unimos el objeto o después añadiendo un atributo usando DirContext.modifyAttributes().

Podemos usar cualquier atributo para grabar este codebase y hacer que nuestra aplicación lea ese atributo desde el directorio y lo use de la forma apropiada.

O podemos usar el atributo "javaCodebase" especificado en la RFC 2713. En este último caso, el proveedor de servicios LDAP de Sun usará automáticamente este atributo para cargar las definiciones de las clases cuando sean necesarias. "javaCodebase" debería contener la URL de un directorio codebase o un fichero JAR (Observa que los ficheros JAR sólo funcionan en la plataforma Java 2). Si el codebase contiene más de una URL, cada una de ellas debe estar separada por un espacio.

El siguiente ejemplo re-emsabla el de la unión de un java.awt.Button.

Difiere en que usa una clase Serializable definida por el usuario, Flower, y suministra un atributo "javaCodebase" que contiene la localización de la definición de la clase Flower. Aquí está el código que hace la unión.

String codebase = ...;

// Create the object to be bound
Flower f = new Flower("rose", "pink");

// Perform the bind and specify the codebase
ctx.bind("cn=Flower", f, new BasicAttributes("javaCodebase", codebase));

Cuando ejecutemos este ejemplo, debemos suministrar la URL de la localización en la que se instaló el fichero Flower.class.

Por ejemplo, si Flower.class se instaló en el servicor Web web1, en el directorio example/classes, ejecutaríamos este ejemplo de esta forma.

# java SerObjWithCodebase http://web1/example/classes/
pink rose

después, podríamos eliminar Flower.class desde nuestro classpath y ejecutar cualquier programa que busque o liste este objeto.


Principio Página
© 1999-2002, Programación en castellano, s.l.
Contacto - Datos legales

ReD Internet: Hospedaje Web | envio sms gratis | Salvapantallas | Fondos de Escritorio, famosas | melodias moviles gratis| Gratis