Arreglar Java.IO.NotSerializableException en Java
-
Reproduzca la excepción
java.io.NotSerializableException
en Java -
Causas de la excepción
java.io.NotSerializableException
en Java -
Solucione la excepción
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.
- La
NotSerializableException
ocurre cuando una instancia de una clase debe implementar una interfazSerializable
. - 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. - 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 interfazSerializable
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.
-
Encuentre la clase que “arroja” esta excepción y hágala
Serializable
implementando la interfazSerializable
. Recuerde, esta solución podría no ser una buena opción si una clase que arroja la excepciónNotSerializableException
pertenece a la biblioteca de terceros. -
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 comotransitorio
?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. -
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();
}
}
Artículo relacionado - Java Error
- Arreglar Java fue iniciado por el código de salida devuelto = 1
- Arreglar JAVA_HOME no se puede determinar a partir del error de registro en R
- Arreglar java.io.IOException: No queda espacio en el dispositivo en Java
- Arreglar Java.Lang.IllegalStateException de Android: no se pudo ejecutar el método de la actividad
- Arreglar Java.Lang.NoClassDefFoundError: No se pudo inicializar el error de clase