Está en la página 1de 12

EJEMPLO CLASE PERSONA CON NETBEANS 6.

SERIALIZACION Y PERCISTENCIA

SERIALIZACION y CONOCIMIENTOS PREVIOS




La serializacin consiste en codificar un objeto como una secuencia de bytes para almacenarlos en memoria o en un archivo para poder guardar el estado de los objetos aunque se cierre el programa. Es utilizada para conseguir persistencia entre diferentes sesiones y para poder transmitir objetos remotamente a travs diferentes mquinas de una red, proceso conocido como invocacin remota de objetos(RMI).

GETTER Y SETTER


No son propios de java, pues son sobre todo una es buena costumbre en la programacin orientada a objetos en varios lenguajes, y adems son parte de la especificacin de JavaBeans.
La razn de crear estos mtodos, es debido a que habitualmente se recomienda que los campos (o propiedades) de una clase sean de acceso privado, es decir, nicamente desde el interior de la clase, y que para accesar o modificar estos valores, se utilicen mtodos pblicos diseados para esa tarea. Estos son los denominados setters (set modificar) y getters (get accesar). Pongamos un ejemplo sencillo, suponiendo que debemos representar a una persona en un objeto, la persona tendr como datos nombre, direccion, y telfono . Crearemos entonces la clase y esos 3 campos, los cuales sern de acceso privado, y crearemos los 3 mtodos setters y los 3 mtodos getters para poder accesarlos y/o modificarlos.

Se puede apreciar que los campos nombre, direccion y telefono son de acceso privado. Los mtodos setNombre, setDireccion y setTelefono, son los setters para dichos campos, los cuales reciben como parmetro el nuevo valor y lo asignan a la propiedad. Algo que tienen en comn stos mtodos es que son de tipo void, lo que quiere decir que no retornan ningun dato, ya que slo sirven para modificar la propiedad, asignando el valor recibido en el parmetro. Los mtodos getNombre, getDireccion y getTelefono, son los mtodos getters, y nos dan acceso al valor actual de la propiedad, al retornarnos su dato almacenado. Estos 3 mtodos si poseen un tipo de datos de retorno, el cual depende del tipo de la propiedad que estn retornando. Tanto los setters como los getters son mtodos de acceso pblico y nos dan la posibilidad de accesar y modificar los campos privados de la clase.

Persistencia en Java


Un objeto se dice persistente cuando es almacenado en un archivo u otro medio permanente. Un programa puede grabar objetos persistentes y luego recuperarlos en un tiempo posterior. Java se provee un mecanismo de serializacin para almacenar objetos en disco. La serializacin se obtiene llamando al mtodo writeObject de la clase ObjectOutputStream para grabar el objeto, para recuperarlo llamamos al mtodo readObject de la clase ObjectInputStream. La serializacin adems de persistencia, se puede usar para transferir objetos desde una mquina a otra a travs de un socket (ELO330).

Interfaz Serializable


 

Slo objetos que implementen la interfaz Serializable pueden ser escritos a stream. La clase de cada objeto es codificada incluyendo el nombre de la clase y la firma de la clase (su prototipo) los valores de los sus campos y arreglos, y la clausura de cualquier otro objeto referenciado desde el objeto inicial. Para hacer que un objeto sea serializable, slo debemos declarar que implementa la interfaz serializable. Nada ms. No hay ntodos que debamos definir. Por razones de seguridad las clases no son serializable por defecto. Hay que tener claro el orden y tipo de los objetos almacenados en disco para recuperarlos en el mismo orden.

Ejemplo: Empleados serializables




 

Class Employee implements Seralizable {....} Employee staff = new Employee[3]; .... out.writeObject(staff); Luego podemos recuperar el objeto haciendo: Employee[] newStaff=(Employee[])in.readObject(); Slo objetos pueden ser serializados con writeObject(). Veamos el ejemplo ObjectFileTest.java

Tratamiento de referencia a objetos


 

Mltiples referencias a un nico objeto son codificadas usando un mecanismo de referencias compartidas de modo que el grafo de objetos puede ser restaurado con la misma forma original. Los mtodos writeObject y readObject se encargan de crear y almacenar un nmero de serie para cada objeto. De este modo objetos ya almacenados no son grabados nuevamente. Supongamos que dada mnager tiene una secretaria. Dos mnager podran compartir la secretaria, en este caso tendriamos algo como:

staff

Employee Name=Eugenia Manager Secretary=

Si grabamos staff, no queremos tres secretarias luego sino algo equivalente a esta vista en memoria.

Manager Secretary= 8

Tratamiento de referencia a objetos


   

Para ello Java utiliza el siguiente algoritmo para serializar (poner nmero de series). A todos los objetos grabados a discos se les asigna un nmero de serie. Antes de grabar un objeto a disco se ve si ya ha sido grabado. Si ya ha sido grabado, se graba lo mismo que el objeto con nmero de series xxx En disco: Sino, se almacena el objeto. Employee name=Eugenia Manager secretary= Manager secretary= Serial number=1 type=Employee name=Eugenia Serial number=2 type=Manager secretary=objeto 1 Serial number=3 type=Manager secretary=objeto 1

Mezcla de objetos serializables y datos bsicos




Podemos hacerlo por medio de los mtodos writeInt, readInt, etc dado que ObjectOutputStream implementa la interfaz DataOutput. Anlogo para la entrada. De datos. Ejemplo: para escribir un objeto,  FileOutputStream ostream = new FileOutputStream("t.tmp");  ObjectOutputStream p = new ObjectOutputStream(ostream);  p.writeInt(12345);  p.writeObject("Today");  p.writeObject(new Date());  p.flush();  ostream.close(); La lectura se hace en forma anloga.  FileInputStream istream = new FileInputStream("t.tmp");  ObjectInputStream p = new ObjectInputStream(istream);  int i = p.readInt();  String today = (String)p.readObject();  Date date = (Date)p.readObject();  istream.close(); 10

Cuando hay objetos no serializables




Clases que requieren manejos especiales durante el proceso de serializacin o deserializacin deben implementar los mtodos:
   

private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; private void writeObject(java.io.ObjectOutputStream stream) throws IOException

 

Se aplica en casos que tengamos objetos que no sean serializables (aquellos que tienen algn dato no serializable) Por ejemplo Point2D.Double no es serializable en Java. Para que no reclame el compilador, definimos nuestro dato Point2D.Double como transiente (transient) y luego definimos los mtodos indicados.

11

Cuando hay objetos no serializables


Ejemplo: public class LabelPoint {.... Private String label; private transient Point2D.Double point; }  Luego implementamos: private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); out.writeDouble(point.getX()); out.writeDouble(point.getY()); } private void readObject(ObjectInutStream in) throws IOException { in.defaultReadObject(); double x=in.readDouble(); double y=in.writeDouble(); point =new Point2D.Double(x,y); }


12

También podría gustarte