Arreglar Java.IO.NotSerializableException en Java

Mehvish Ashiq 12 octubre 2023
  1. Reproduzca la excepción java.io.NotSerializableException en Java
  2. Causas de la excepción java.io.NotSerializableException en Java
  3. Solucione la excepción java.io.NotSerializableException en Java
Arreglar Java.IO.NotSerializableException en Java

Hoy reproduciremos la excepción java.io.NotSerializableException mientras escribimos un programa en Java. También entenderemos qué significa este error, lo que lleva a sus causas y soluciones.

Reproduzca la excepción java.io.NotSerializableException en Java

Código de ejemplo (archivo Student.java):

package com.serializertest;

class Student {
  private String studentId;

  public String getId() {
    return studentId;
  }
  public void setId(String id) {
    this.studentId = id;
  }
}

La clase Estudiante es una clase auxiliar con una variable miembro llamada studentId. También tiene métodos miembros llamados getId() y setId() para obtener y establecer el id de un estudiante.

Código de ejemplo (archivo SerializerTest.java):

package com.serializertest;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializerTest {
  public static void main(String[] args) throws IOException {
    FileOutputStream fileOutputStream = new FileOutputStream("students.txt");
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

    Student student = new Student();
    student.setId("0001");

    objectOutputStream.writeObject(student);
    objectOutputStream.close();
  }
}

El SerializerTest es nuestra clase principal donde tenemos el método de controlador main(). Dentro de main(), creamos una instancia de la clase FileOutputStream para crear un archivo.

Del mismo modo, creamos otra instancia de la clase ObjectOutputStream.

Luego, creamos un objeto de la clase Estudiante y llamamos a su método setId() pasando un argumento de cadena. A continuación, usamos el objeto de la clase ObjectOutputStream para escribir un objeto en la secuencia.

Para eso, estamos usando el método writeObject().

Después de eso, cerramos el flujo usando el método close() y ejecutamos el programa, pero nos da la siguiente excepción en la consola de salida del programa.

Exception in thread "main" java.io.NotSerializableException: com.serializertest.Student

¿Por qué nos enfrentamos a esto? Comprendamos el error para descubrir sus causas a continuación.

Causas de la excepción java.io.NotSerializableException en Java

Es fundamental entender NotSerializableException y Serialization para encontrar las causas.

La serialización es un mecanismo en la programación Java que usamos para escribir el estado de un objeto en el flujo de bytes. Por el contrario, la operación inversa se llama Deserialización.

La Serialización y la Deserialización son independientes de la plataforma. Significa que ambos procesos se pueden realizar en diferentes plataformas.

Usamos Serialización en Invocación de método remoto (RMI) y Enterprise Java Beans (EJB). También se utiliza en la API de persistencia de Java (JPA), Hibernate, etc.

La NotSerializableException es una excepción que amplía la clase ObjectStreamException, definida como una superclase de todas las demás excepciones específicas de las clases de Object Stream.

Además, la ObjectStreamException amplía la IOException, que indica además que se ha generado una excepción de E/S.

Ahora, conocemos la Serialización y NotSerializableException en Java. Esta discusión nos lleva a descubrir las razones de NotSerializableException en Java.

  1. La NotSerializableException ocurre cuando una instancia de una clase debe implementar una interfaz Serializable.
  2. También obtenemos esta excepción por una instancia de una clase o el tiempo de ejecución de serialización. Recuerde, el argumento de NotSerializableException es el nombre de una clase.
  3. Según la documentación, el gráfico de objetos completo debe ser serializable. La NotSerializableException también ocurre si al menos uno de los campos no implementa la interfaz Serializable al intentar serializar una instancia de una clase.

Solucione la excepción java.io.NotSerializableException en Java

Podemos arreglar la excepción java.io.NotSerializableException en Java usando las siguientes soluciones.

  1. Encuentre la clase que “arroja” esta excepción y hágala Serializable implementando la interfaz Serializable. Recuerde, esta solución podría no ser una buena opción si una clase que arroja la excepción NotSerializableException pertenece a la biblioteca de terceros.

  2. Podemos declarar los objetos como transitorios si la clase se refiere a los objetos no serializables donde estos objetos no deben ser serializables. La pregunta es, ¿por qué declararlo como transitorio?

    Es porque los campos de la clase declarados como transitorios serían ignorados por el tiempo de ejecución serializable y no obtendremos ninguna excepción.

  3. Si necesitamos sus datos y los de terceros, podemos considerar otros medios de serialización. Por ejemplo, XML, JSON, etc., donde podemos serializar los objetos de terceros sin cambiar sus definiciones.

En nuestro caso, la implementación de Serializable corrigió la excepción java.io.NotSerializableException. Consulte el siguiente código de ejemplo.

Código de ejemplo (archivo Students.java):

package com.serializertest;

import java.io.Serializable;

class Student implements Serializable {
  private String studentId;

  public String getId() {
    return studentId;
  }
  public void setId(String id) {
    this.studentId = id;
  }
}

Código de ejemplo (archivo SerializerTest.java):

package com.serializertest;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializerTest {
  public static void main(String[] args) throws IOException {
    FileOutputStream fileOutputStream = new FileOutputStream("students.txt");
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

    Student student = new Student();
    student.setId("0001");

    objectOutputStream.writeObject(student);
    objectOutputStream.close();
  }
}
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Artículo relacionado - Java Error