Interfaz serializable en Java con ejemplos

Publicado: 2021-11-29

Java ofrece varios paquetes, de los cuales la interfaz Serializable es uno. Está presente en el paquete de Java java.io y es un tipo de interfaz de marcador. Cuando se define como una interfaz de marcador, no hay métodos o campos presentes en la interfaz. Por lo tanto, siempre que alguna clase implemente la interfaz, no se requiere que la interfaz implemente ningún método. Las clases implementan la interfaz si una clase quiere que sus instancias se serialicen o se deserialicen.

El mecanismo de serialización se utiliza para convertir el estado de un objeto en un flujo de bytes. Este mecanismo se lleva a cabo utilizando ObjectOutputStream. El proceso de deserialización es justo lo contrario del proceso de serialización. En este caso, el flujo de bytes se vuelve a convertir en el objeto de Java. ObjectInputStream se utiliza para la deserialización.

Tabla de contenido

Publicación por entregas

La conversión del estado de cualquier objeto en un flujo de bytes se conoce como serialización. Y lo opuesto a la serialización es la deserialización. Un objeto de Java se puede convertir en un flujo de bytes estáticos. Este flujo estático se puede guardar en una base de datos o también se puede transferir a una red diferente. El proceso de serialización depende de la instancia. Esto significa que la serialización de objetos se puede realizar en una plataforma y luego la deserialización de los objetos se puede realizar en otra plataforma. Se implementa un tipo particular de interfaz de marcador, "Serializable", para el proceso de serialización. Entonces, las clases elegibles para la serialización, es decir, la clase serializable en Java , debe implementar la interfaz de marcador.

Este mecanismo de escribir un estado de objeto en un flujo de bytes se conoce como serialización. El mecanismo se utiliza principalmente en tecnologías JMS, EJB, JPA, RMI e Hibernate.

ObjectInputStream y ObjectOutputStream son las formas de clases de alto nivel que amplían java.io.InputStream y java.io.OutputStream. Los tipos primitivos y los gráficos de objetos pueden ser escritos en OutputStream por ObjectOutputStream en un byte

Arroyo. El flujo que resulta de la conversión se puede leer a través de ObjectInputStream. Entonces, para la serialización, se llama al método writeObject() desde ObjectOutputStream y para la deserialización, se llama al método readObject() desde la clase ObjectInputStream.

El método más importante en ObjectOutputStream es:

La línea de código anterior se tomó de https://www.baeldung.com/java-serialization.

En la línea de código anterior, se toma un objeto serializable y luego se convierte en un flujo o flujo de bytes.

En el caso de ObjectInputStream, el método más crítico es:

La línea de código anterior se tomó de https://www.baeldung.com/java-serialization.

La línea de código anterior puede leer la secuencia de bytes y convertir este flujo de bytes en un objeto de Java. El objeto original se puede devolver a través de esto.

Una ilustración del proceso de serialización se puede describir a continuación:

Se considera una clase "Persona" para la serialización. Los campos estáticos no están serializados y pertenecen a algunas clases. Los campos de clase se pueden ignorar utilizando la palabra clave "transitorio" en el proceso de serialización.

Fuente

El objeto del tipo de persona se puede guardar en algún archivo local y luego se vuelve a leer el valor. El código que se muestra a continuación se puede usar para este propósito.

ObjectOutputStream se usó para guardar el estado del objeto en un archivo mediante el uso de FileOutputStream. En este ejemplo, se ha creado un archivo llamado “yourfile.txt” en el directorio del proyecto. Mediante el uso de FileInputStream, se carga el archivo creado. Luego, ObjectInputStream recoge esta secuencia y la convierte en un nuevo objeto con el nombre p2. El estado del objeto cargado finalmente se prueba y se compara con el estado del objeto original. El objeto que se carga tiene que lanzarse explícitamente a la persona típica.

Advertencias en la serialización de Java

1. Herencia y Composición

Cada vez que un usuario implementa la interfaz java.io.Serializable, todas las subclases de clase que implementan la interfaz se vuelven serializables. Además, si un objeto contiene una referencia a un objeto diferente, los objetos a los que se hace referencia para implementar la interfaz se pueden serializar por separado; si estos objetos no implementan la interfaz, se descartará una excepción. La excepción lanzada será NotSerializableException. Además, si se supone que una matriz de objetos se almacena en un objeto serializable, todos los objetos de la matriz deben serializarse. Si no ocurre la serialización de los objetos, arrojará la excepción "NotSerializableException".

2. UID de la versión en serie

Para cada clase que implementa la interfaz Serializable, se asocia un número con cada una de las clases. El número está asociado con la máquina virtual de Java. Esto se hace principalmente para verificar que los objetos que se cargan y guardan tienen los atributos exactos. Solo si los atributos son los mismos, los objetos serían compatibles tras la serialización. Los IDE generan estos números automáticamente y se basan principalmente en los nombres de la clase, sus atributos y los modificadores de acceso asociados con ella. Se lanzará una excepción, "InvalidClassException", si los cambios dan como resultado un número diferente.

Si una clase serializable no declara un serialVersionUID, la JVM lo generará automáticamente durante el tiempo de ejecución. Aunque habrá una generación automática del número, aún se recomienda que las clases declaren un serialVersionUID. Esto se debe a que serialVersionUID, que se generará automáticamente, dependerá del compilador y, en ocasiones, puede generar InvalidClassExceptions inesperadas.

3. Serialización personalizada

Se ha establecido una forma predeterminada en Java para serializar los objetos. Java puede anular este comportamiento predeterminado. Hay una forma de serialización personalizada. Es particularmente útil en los casos en que se intenta serializar el objeto que tiene atributos no serializables. La serialización de dichos objetos se puede realizar a través de dos métodos dentro de una clase que el usuario desea serializar. Estos dos métodos son:

Los dos métodos anteriores se pueden utilizar para serializar los atributos en cualquier formulario que se pueda serializar, que anteriormente no se podía serializar.

Ventajas de la serialización en Java

Una de las ventajas de la serialización en Java es que el estado de un objeto se puede recorrer en una red.

La interfaz Java java.io.Serializable

java.io.Serializable es una interfaz de marcador, lo que significa que no hay métodos ni objetos dentro de la interfaz. La función principal de la interfaz de marcador es marcar el

clases de Java para dar una capacidad particular a todos los objetos de las clases. Ejemplos de interfaces de marcador son Remote y Cloneable.

La interfaz debe ser implementada por cualquier clase que utilice la interfaz para serializar sus objetos. De forma predeterminada, las clases como las clases contenedoras y la clase String implementan la interfaz java.io.Serializable.

A continuación se muestra un ejemplo serializable de Java.

En el código anterior, se puede observar que la clase Student implementa la interfaz Serializable. Por lo tanto, una vez que la clase implementa la interfaz Serializable, los objetos dentro de la clase se pueden convertir en bytes de flujo.

  • clase ObjectOutputStream

Esta clase se utiliza para escribir los tipos primitivos de datos y los objetos Java en OutputStream. El objeto que admite la interfaz java.io.Serializable se puede usar para escribirse en secuencias.

  • clase ObjectInputStream

Todos los datos primitivos que se escribieron mediante ObjectOutputStream se deserializan mediante ObjectInputStream.

A continuación se muestra un ejemplo de una interfaz serializable en Java.

En este ejemplo, la clase Student se va a serializar. El método writeObject() de la clase ObjectOutputStream proporciona toda la funcionalidad para serializar los objetos. El estado del objeto se guarda en un archivo con el nombre f.txt.

Conclusiones

El artículo discutió el concepto de serialización en Java. Enumeró las interfaces y los otros métodos importantes necesarios para serializar los objetos de una clase. El proceso de serialización siempre está asociado con una identificación o un número con cada clase serializable. Este número se denomina SerialVersionUID. El uso principal de SerialVersionUID es verificar el remitente y el receptor del objeto que se va a serializar. Esto se debe a que tanto el emisor como el receptor deben ser el mismo.

Es una característica importante del lenguaje de programación Java. Si desea obtener más información sobre características y conceptos tan importantes en Java y dominar sus habilidades con el lenguaje de programación, puede consultar los cursos de ingeniería de software que ofrece upGrad. Si eres un profesional que trabaja, el curso es el más adecuado para ti. Para cualquier tipo de consulta, nuestro equipo de asistencia puede ser contactado. También puede navegar por nuestro sitio web para el curso específico y obtener información detallada.

¿Qué es la interfaz serializable en Java?

La interfaz serializable es una interfaz de marcador. La interfaz de marcador proporciona una pista al tiempo de ejecución de Java de que la clase de implementación permite serializarse. El tiempo de ejecución aprovechará esta interfaz para serializar el objeto. La interfaz serializable en java es una interfaz especial para ser implementada por clases de datos en java. Cuando una clase implementa esta interfaz, puede persistir en una base de datos. Esta interfaz se declara en el paquete java.io. La interfaz serializable tiene dos métodos, readResolve() y writeReplace() , que se utilizan para leer y escribir objetos en la base de datos.

¿Qué sucede si implementamos la interfaz Serializable en Java?

Implementar la interfaz Serializable en Java significa tener un objeto que se puede serializar y deserializar en cualquier sistema que tenga una interfaz Serializable. La implementación de dicha interfaz sería efectiva cuando la clase esté siendo serializada externamente por bibliotecas de terceros (JSON, XML, etc.) o por protocolos de red. Cuando una variable se declara como serializable, cada instancia de la variable se serializará y deserializará si se pasa como parámetro a un método o cuando se devuelve desde un método. La serialización se realiza mediante programación para que el estado de un objeto se pueda conservar para más adelante, cuando sea necesario deserializarlo y presentarlo al usuario del objeto.

¿Podemos transferir un objeto serializado a través de la red?

Un objeto serializado es un objeto que contiene un flujo de bytes. El constructor del objeto o los métodos writeObject() / readObject() se utilizan para colocar el flujo de bytes en el objeto. Los datos almacenados pueden ser texto, audio, video o cualquier dato de aplicación personalizada. Los datos de estos objetos pueden almacenarse en un archivo o en un servidor remoto. Para transferir objetos serializados a través de la red, se debe usar el protocolo RMI (Invocación de método remoto). RMI es un buen protocolo para crear aplicaciones distribuidas. Permite que el cliente se comunique con métodos en objetos en una aplicación Java que se ejecuta en un servidor. El protocolo RMI es un mecanismo de llamada a procedimiento remoto (RPC).