Ir a contenido principal

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. Cierta información de su perfil de developerWorks será mostrada públicamente, pero usted puede editar la información en cualquier momento. Su nombre, apellido (a menos que usted elija ocultarlo) y nombre de usuario acompañarán el contenido que usted publique.

Toda la información enviada es segura.

  • Cerrar [x]

La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

Toda la información enviada es segura.

  • Cerrar [x]

Introducción a la programación Java, parte 2: Construcciones para aplicaciones del mundo real

Funciones más avanzadas del lenguaje Java

J. Steven Perry, Consultor Director, Makoto Consulting Group, Inc.
J. Steven Perry
J. Steven Perry es desarrollador de software, arquitecto y fanático general de Java que ha estado desarrollando software profesionalmente desde 1991. Sus intereses profesionales abarcan desde el funcionamiento interno de la JVM hasta el modelo UML y todo lo que está en el medio. Steve tiene una pasión por escribir y ser mentor. Es el autor de Java Management Extensions (O'Reilly), Log4j (O'Reilly) y los artículos de developerWorks de IBM "Joda-Time" y OpenID for Java Web applications". Pasa tiempo libre con sus tres hijos, anda en bicicleta y enseña yoga.

Resumen:  En la Parte 1 de este tutorial, el programador Java™ profesional J. Steven Perry presentó la sintaxis del lenguaje Java y las bibliotecas que usted necesita para escribir aplicaciones Java simples. La Parte 2, todavía orientada a desarrolladores nuevos en el desarrollo de aplicaciones Java, presenta las construcciones de programación más sofisticadas requeridas para crear complejas aplicaciones Java del mundo real. Los temas que se cubren incluyen manejo de excepciones, herencia y abstracción, expresiones regulares, genéricos, E/S Java y serialización Java.

Ver más contenido de esta serie

Fecha:  10-12-2012
Nivel:  Introductoria PDF:  A4 and Letter (927 KB | 54 páginas)Get Adobe® Reader®

Comentario:  

Serialización Java

La serialización Java es otra de las bibliotecas esenciales de la plataforma Java. La serialización se usa principalmente para la persistencia de objetos y objetos remotos, dos casos de uso donde necesita poder tomar una instantánea del estado de un objeto y luego reconstituirlo posteriormente. Esta sección le da una idea de la API de serialización Java y le muestra cómo usarlo en sus programas.

¿Qué es la serialización de objetos?

La serialización es un proceso en el que el estado de un objeto y sus metadatos (como el nombre de clase del objeto y los nombres de sus atributos) se almacenan en un formato binario especial. Poner el objeto en este formato,— serializándolo, — preserva toda la información necesaria para reconstituir (o deserializar) el objeto cuando usted necesite hacerlo.

Hay dos casos de usos primarios para la serialización de objetos:

  • La persistencia de objetos significa almacenar el estado del objeto en un mecanismo de persistencia permanente, como por ejemplo una base de datos.
  • Los objetos remotos implican el envío del objeto a otra computadora o sistema.

java.io.Serializable

El primer paso para hacer que la serialización funcione es permitir que sus objetos usen el mecanismo. Cada objeto que usted quiera que sea serializable debe implementar una interfaz llamada java.io.Serializable:

import java.io.Serializable;
public class Person implements Serializable {
// etc...
}

La interfaz Serializable marca los objetos de la clase Person al tiempo de ejecución como serializable. Cada subclase de Person también se marcará como serializable.

Cualquier atributo de un objeto que no sea serializable causará que el tiempo de ejecución Java arroje una NotSerializableException si intenta serializar su objeto. Puede gestionar esto al usar la palabra clave transient para comunicarle al tiempo de ejecución que no intente serializar ciertos atributos. En ese caso, usted es responsable de asegurarse de que los atributos se restauren para que su objeto funcione adecuadamente.

Serializar un objeto

Ahora probará un ejemplo que combina lo que acaba de aprender acerca de E/S de Java con lo que está aprendiendo ahora acerca de la serialización.

Suponga que usted crea y llena un objeto Manager (recuerde que Manager está en el gráfico de herencias de Person, que es serializable) y luego quiere serializar ese objeto para una OutputStream, es este caso para un archivo. Ese proceso se muestra en el Listado 29:


Listado 29. Serializar un objeto
Manager m = new Manager();
m.setEmployeeNumber("0001");

m.setGender(Gender.FEMALE);
m.setAge(29);
m.setHeight(170);
m.setName("Mary D. Boss");
m.setTaxpayerIdentificationNumber("123-45-6789");
log.info("About to write object using serialization... object looks like:");
m.printAudit(log);
try {
 String filename = "Manager-" + m.hashCode() + ".ser";
 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename));
 oos.writeObject(m);
 log.info("Wrote object...");
} catch (Exception e) {
 log.log(Level.SEVERE, "Caught Exception processing object", e);
}

El primer paso es crear el objeto y establecer algunos valores de atributos. Luego, se crea una OutputStream, en este caso una FileOutputStream y luego se llama a writeObject() en esa secuencia. writeObject() es un método que usa serialización Java para serializar un objeto para la secuencia.

En este ejemplo, usted está almacenando el objeto en un archivo pero se usa esta misma técnica para cualquier tipo de serialización.

Deserialización de un objeto

Todo el punto de la serialización de un objeto es poder reconstituirlo, o deserializarlo. El Listado 30 lee el archivo que usted acaba de serializar y deserializa sus contenidos, restaurando de este modo el estado del objeto Manager:


Listado 30. Deserialización de un objeto

Manager m = new Manager();
m.setEmployeeNumber("0001");
m.setGender(Gender.FEMALE);
m.setAge(29);
m.setHeight(170);
m.setName("Mary D. Boss");
m.setTaxpayerIdentificationNumber("123-45-6789");
log.info("About to write object using serialization... object looks like:");
m.printAudit(log);
try {
 String filename = "Manager-" + m.hashCode() + ".ser";
 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename));
 oos.writeObject(m);
 log.info("Wrote object...");

 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename));
 m = (Manager)ois.readObject();
 log.info("Read object using serialization... object looks like:");
 m.printAudit(log);
} catch (Exception e) {
 log.log(Level.SEVERE, "Caught Exception processing object", e);
}

Para la mayoría de los propósitos de aplicaciones, marcar sus objetos como serializables es de todo lo que tendrá que preocupar siempre cuando se trate de la serialización. En casos donde usted sí necesita serializar y deserializar sus objetos explícitamente, puede usar la técnica que se muestra en los Listados 29 y 30. Pero mientras los objetos de sus aplicaciones de desarrollan, y usted les agrega y elimina atributos, la serialización toma una nueva capa de complejidad.


serialVersionUID

En los primeros días del middleware y la comunicación de objetos remotos, los desarrolladores eran en gran medida responsables de controlar el "formato de conexión física" de sus objetos, lo cual causó un sinfín de dolores de cabeza mientras la tecnología comenzaba a evolucionar.

Suponga que usted agregó un atributo a un objeto, lo recompiló y redistribuyó el código a cada máquina en un clúster de aplicaciones. El objeto se almacenaría en una máquina con una versión del código de serialización pero accederían otras máquinas que podrían tener una versión diferente del código. Cuando esas máquinas intentaran deserializar el objeto, a menudo sucederían cosas malas.

Los metadatos de la serialización Java, — la información incluida en el formato de serialización binaria, — son sofisticados y resuelven muchos de los problemas que asediaban a los primeros desarrolladores de middleware. Pero no pueden resolver todos los problemas.

La serialización Java usa una propiedad denominada serialVersionUID para ayudarlo a lidiar con diferentes versiones de objetos en un escenario de serialización. No necesita declarar esta propiedad en sus objetos; de forma predeterminada, la plataforma Java usa un algoritmo que computa un valor para ella en base a los atributos de su clase, su nombre de clase y posición en el clúster galáctico local. La mayoría de las veces, eso funciona bien. Pero si agrega o elimina un atributo, ese valor dinámicamente generado cambiará y el tiempo de ejecución Java arrojará una InvalidClassException.

Para evitar esto, usted debería acostumbrase a declarar explícitamente una serialVersionUID:

import java.io.Serializable;
public class Person implements Serializable {
 private static final long serialVersionUID = 20100515;
// etc...
}

Recomiendo usar algún tipo de plan para su número de versión de serialVersionUID (he usado la fecha actual en el ejemplo anterior) y debería declararlo private static final y de tipo long.

Tal vez se esté preguntando cuándo cambiar esta propiedad. La respuesta breve es que debería cambiarla cuando usted hace un cambio incompatible a la clase, lo que normalmente significa que ha eliminado un atributo. Si usted tiene una versión del objeto en una máquina en la que se ha eliminado el atributo, y el objeto se hace remoto en una máquina con una versión del objeto donde se espera el atributo, entonces las cosas se pueden tornar extrañas.

Como regla general, siempre que agregue o elimine funciones (es decir, atributos o métodos) de una clase, debería cambiar su serialVersionUID. Es mejor obtener una InvalidClassException en el otro extremo de la conexión que un error de aplicación que se debe a un cambio de clase incompatible.

11 de 14 | Anterior | Siguiente

Comentario



static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=tecnologia Java
ArticleID=850709
TutorialTitle=Introducción a la programación Java, parte 2: Construcciones para aplicaciones del mundo real
publish-date=12102012
author1-email=steve.perry@makotoconsulting.com
author1-email-cc=