Sei sulla pagina 1di 6

Serializacin de objetos en Java 2

Introduccin
La serializacin de un objeto consiste en obtener una secuencia de bytes que represente el estado de dicho objeto. Esta secuencia puede utilizarse de varias maneras (puede enviarse a travs de la red, guardarse en un fichero para su uso posterior, utilizarse para recomponer el objeto original, etc.).

Estado de un objeto
El estado de un objeto viene dado, bsicamente, por el estado de sus campos. As, serializar un objeto consiste, bsicamente, en guardar el estado de sus campos. Si el objeto a serializar tiene campos que a su vez son objetos, habr que serializarlos primero. ste es un proceso recursivo que implica la serializacin de todo un grafo (en realidad, un rbol) de objetos. Adems, tambin se almacena informacin relativa a dicho rbol, para poder llevar a cabo la reconstruccin del objeto serializado. En ocasiones puede interesar que un atributo concreto de un objeto no sea serializado. Esto se puede conseguir utilizando el modificador transient, que informa a la JVM de que no nos interesa mantener el valor de ese atributo para serializarlo o hacerlo persistente. Ejemplo:
public class MiFecha { protected int n; protected Date fecha; protected transient long s; . . . }

En este ejemplo, los atributos n y fecha sern includos en la secuencia de bytes resultante de serializar un objeto de clase MiFecha. El atributo s no ser includo, por tener el modificador transient.

Objetos serializables. Interfaz Serializable


Un objeto serializable es un objeto que se puede convertir en una secuencia de bytes. Para que un objeto sea serializable, debe implementar la interfaz java.io.Serializable. Esta interfaz no define ningn mtodo. Simplemente se usa para 'marcar' aquellas clases cuyas instancias pueden ser convertidas a secuencias de bytes (y posteriormente reconstruidas). Objetos tan comunes como String, Vector o ArrayList implementan Serializable, de modo que pueden ser serializados y reconstruidos ms tarde. Para serializar un objeto no hay ms que declarar el objeto como serializable: public class MiClase implements java.io.Serializable El sistema de ejecucin de Java se encarga de hacer la serializacin de forma automtica.

Ejemplos
Almacenamiento de objetos
Es posible utilizar los mecanismos de serializacin disponibles para serializar un objeto guardndolo en un fichero y para realizar el proceso inverso, recuperndolo desde el fichero.
FileOutputStream fos = new FileOutputStream("fichero.bin");

FileInputStream fis = new FileInputStream("fichero.bin"); ObjectOutputStream out = new ObjectOutputStream(fos); ObjectInputStream in = new ObjectInputStream(fis); ClaseSerializable o1 = new ClaseSerializable(); ClaseSerializable o2 = new ClaseSerializable(); // Escribir el objeto en el fichero out.writeObject(o1); out.writeObject(o2); . . . // Leer el objeto del fichero (en el mismo orden !!) o1 = (ClaseSerializable)in.readObject(); o2 = (ClaseSerializable)in.readObject();

Envo de objetos por la red


Tambin es posible enviar un objeto serializado a travs de la red. La diferencia consiste en que ahora se utilizan streams de distinto tipo.
Socket socket = new Socket(maquina, puerto); OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); ObjectOutputStream out = new ObjectOutputStream(os); ObjectInputStream in = new ObjectInputStream(is); PeticionSerializable ps = new PeticionSerializable(); RespuestaSerializable rs; // Escribir una peticin en el socket out.writeObject(ps); // Recibir del socket la respuesta rs = (RespuestaSerializable)in.readObject();

Serializacin en RMI
En RMI, la serializacin se utiliza de forma casi transparente al usuario. Concretamente, se utiliza en el paso de parmetros y retorno de valores de las invocaciones a mtodos de objetos remotos. Por ejemplo, cuando hacemos una invocacin remota del tipo retorno obj.metodo(param); ocurre el siguiente proceso, de forma transparente al usuario: 1. (Local) El objeto param se serializa y se enva al objeto remoto como una secuencia de bytes 2. (Remoto) Se obtiene el objeto original a partir de la secuencia de bytes 3. (Remoto) Se ejecuta el mtodo y se obtiene un valor de retorno 4. (Remoto) El valor de retorno se serializa y se enva como una secuencia de bytes 5. (Local) Se obtiene el retorno a partir de la secuencia de bytes Para que esta invocacin se lleve a cabo, es necesario que tanto los parmetros de las invocaciones remotas como los valores devueltos pertenezcan a clases serializables.

Serializacin personalizada
En ocasiones puede interesar tomar el control sobre el proceso de serializacin de una clase en concreto. Esto se puede hacer 'sobrecargando' los mtodos writeObject y readObject de la clase cuya serializacin se quiere controlar. En realidad, no se puede hablar de sobrecarga, puesto que estos mtodos no estn definidos en java.lang.Object. Este punto es un poco oscuro. Puede consultarse el API al respecto (mtodo writeObject(Object) de ObjectOutputStream java.io.ObjectOutputStream y mtodo readObject() de ObjectInputStream) y el JavaTutorial

(Essential Java Classes -> Reading and Writing (but no 'rithmetic) -> Object Serialization -> Providing Object Serialization for Your Classes). Para 'personalizar' la serializacin de un objeto, basta aadir un mtodo tal que:
private void writeObject (ObjectOutputStream stream) throws IOException { stream.defaultWriteObject(); . . . }

Es necesario respetar exactamente tanto la signatura del mtodo como la primera accin a realizar. A continuacin pueden aadirse otras acciones que escriban en el stream dado. Tambin ser necesario aadir un mtodo para hacer el paso inverso:
private void readObject (ObjectInputStream stream) throws IOException { stream.defaultReadObject(); . . . }

Aqu hay un ejemplo muy sencillo de uso de estos dos mtodos. Con los println es posible comprobar que realmente se ejecutan cuando se produce la serializacin y la reconstruccin de un objeto Prueba.

Interfaz Externalizable
Existe una interfaz en java.io llamada Externalizable que permite obtener un mayor control sobre el proceso de serializacin y reconstruccin de nuestros objetos. Esta interfaz define dos mtodos, writeExternal y readExternal, que se encargan de serializar y reconstruir un objeto, respectivamente. La serializacin mediante Externalizable requiere de un mayor cuidado. De forma automtica, slo se guarda informacin relativa a la identidad de la clase del objeto que se est serializando. No se guarda automticamente ni su estado ni informacin relativa a sus superclases. Por ello, en la implementacin de writeExternal hay que guardar explcitamente el estado de aquellos atributos que nos interesen, incluidos los heredados. A la hora de implementar writeExternal y readExternal, se ha de tener muy en cuenta la serializacin de las clases superiores en el grafo de herencia y coordinar la implementacin de estos mtodos con la de los mismos mtodos en clases superiores.

RPC El RPC (del ingls Remote Procedure Call, Llamada a Procedimiento Remoto) es un protocolo que permite a un programa de ordenador ejecutar cdigo en otra mquina remota sin tener que preocuparse por las comunicaciones entre ambos. El protocolo es un gran avance sobre los sockets usados hasta el momento. De esta manera el programador no tena que estar pendiente de las comunicaciones, estando stas encapsuladas dentro de las RPC. Las RPC son muy utilizadas dentro del paradigma cliente-servidor. Siendo el cliente el que inicia el proceso solicitando al servidor que ejecute cierto procedimiento o funcin y enviando ste de vuelta el resultado de dicha operacin al cliente. Hay distintos tipos de RPC, muchos de ellos estandarizados como pueden ser el RPC de Sun denominado ONC RPC (RFC 1057), el RPC de OSF denominado DCE/RPC y el Modelo de Objetos de Componentes Distribuidos de Microsoft DCOM. Ninguno de estos es compatible entre s. La mayora de ellos utilizan un lenguaje de descripcin de interfaz (IDL) que define los mtodos exportados por el servidor. Hoy en da se est utilizando el XML como lenguaje para definir el IDL y el HTTP como protocolo de red, dando lugar a lo que se conoce como servicios web. Ejemplos de stos pueden ser SOAP o XML-RPC. package ejemplosRMI . hebras ; import java . rmi. Remote ; import java . rmi. RemoteException ; public interface Prueba1 extends Remote { public int mete ( String s) throws RemoteException , InterruptedException ; public int saca () throws RemoteException ; } package ejemplosRMI . hebras ; import java . rmi. server . UnicastRemoteObject ; import java . rmi. RemoteException ; import java . rmi. RMISecurityManager ; import java . rmi. Naming ; public class Prueba1Impl extends UnicastRemoteObject implements Prueba1 { private int hanEntrado ; public synchronized int mete ( String s) throws RemoteException , InterruptedException { hanEntrado ++; System . out. println (" Entrando :"+s+":"+"han entrado :"+ hanEntrado ); wait (); System . out. println (" Saliendo :"+s+":"+"hay dentro :"+ hanEntrado ); return hanEntrado ;

} public synchronized int saca () throws RemoteException { System . out. println (" sacando ..."); notify (); return hanEntrado ; } public Prueba1Impl () throws RemoteException { hanEntrado = 0; } } LENGUAJES DE PROGRAMACIN PARALELA No encontraremos ningn lenguaje de programacin para mquinas paralelas tan potente como el verstil C compilado con GCC. An as, existen lenguajes de ms alto nivel adecuados para estos menesteres, entre ellos, cabe citar:

Fortran:

Fortran, tal y como es hoy es un lenguaje de alto nivel, con numerosas mejoras con respecto al ANSI del 1966, (objetos como los de C++, instrucciones para procesamiento en paralelo,...) De echo podemos encontrar compiladores capaces de generar cdigo para arquitecturas paralelas tipo SMP y Clusters entre otras. Como ejemplo de stos cito: HPFC (HPF Compiler) que se encuentra en la siguiente web: http://www.cri.ensmp.fr/~coelho/hpfc.html.

Mentat:

Mentat es un lenguaje orientado a objetos para procesamiento en paralelo, funciona en mquinas clusters y se encuentra disponible para Linux. Su sintaxis es similar a la del popular C++.

Parallaxis-III:

Es un lenguaje de programacin estructurada basado en Modula-2 pero con extensiones para trabajar con mquinas SIMD (Simple Instruction Multiple Data). La distribucin bsica de este compilador suele incluir adems: un depurador de cdigo y ejemplos de algoritmos.

PVM:

La PVM (Parallel Virtual Machine) no es ms que un API GNU de programacin C para mquinas paralelas, capaz de crear una mquina virtual paralela, es decir, emplea los recursos libres de cada uno de los nodos sin tener que preocuparnos del cmo, hacindonos creer que estamos ante una nica super-mquina. El que para m es el mejor punto de la PVM es que si disponemos de una red UNIX no tenemos ms que instalar el software que, adems, es libre y ya dispondremos de un supercomputador

paralelo con un coste nulo, y podremos ponernos a trabajar con l sin dejar de emplear cada mquina de la red para las mismas funciones que antes. Adems, PVM est portado para otras mquinas adems de Linux, entre las que se encuentran distintos tipos de UNIX e incluso existe una versin para NT aunque cabe decir que alcanza unas velocidades bastante inferiores a las que alcanza con Linux. Como conclusin creo interesante comentar que la PVM ofrece una abstraccin inigualable, pero que, an as, en muchos casos, sobre todo para tareas con alto grado de acoplamiento, la mejor solucin al menos en lo que a rendimiento se refiere, es un diseo especfico, siendo a veces la nica manera posible. MODELOS DE PROGRAMACIN PARALELA Modelos de Programacin para Multiprocesadores El Modelo de Variables Compartidas El Modelo de Paso de Mensajes Paralelizacin Automtica

Modelos de Programacin para Multiprocesadores Modelos de Programacin Secuencial FORTRAN 77 FORTRAN 77 + Libreras Paralelas Modelos de Programacin Paralela Variables Compartidas Paso de Mensajes

GLUSTER Gluster es una distribucin GNU para clusters de computadoras orientada a poner a disposicion de cualquiera que lo desee las herramientas de Supercomputacin y Superalmacenamiento. El ncleo de Gluster provee una plataforma para el desarrollo de aplicaciones de para clusters adaptas a una tarea especfica como lo son Clusterizacin HPC, Clusters de almacenamiento, Previsin empresarial, Clusters de Bases de Datos, etc. Gluster est diseado para una masiva escalabilidad y desempeo y hace que el difcil uso de operaciones multi-casting y RDMA (Acceso Remoto Directo a Memoria) sea posible.

Potrebbero piacerti anche