Sistema de Nombrado en Java (JNDI) [Parte I]

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO