NotSerializableException en Java con ejemplos

La serialización en Java es un mecanismo para escribir el estado de un objeto en un flujo de bytes. Se utiliza principalmente en las tecnologías Hibernate, RMI, JPA, EJB y JMS.

La operación inversa de serialización se denomina deserialización, donde el flujo de bytes se convierte en un objeto. El proceso de serialización y deserialización es independiente de la plataforma, lo que significa que puede serializar un objeto en una plataforma y deserializarlo en una plataforma diferente.

En Java, se lanza una excepción NotSerializableException cuando una instancia de una clase debe implementar la interfaz Serializable. La excepción la genera el tiempo de ejecución de serialización o la instancia de la clase. El argumento de NotSerializableException es el nombre de la clase.

La clase NotSerializableException amplía la clase ObjectStreamException, que se define como la superclase de todas las excepciones específicas de las clases de Object Stream. Además, la clase ObjectStreamException amplía la IOException que indica que se ha producido una excepción de E/S.

Ilustración: 

java.io
Class NotSerializableException
    java.lang.Object
        java.lang.Throwable
            java.lang.Exception
                java.io.IOException
                    java.io.ObjectStreamException
                        java.io.NotSerializableException

Nota: Todas las interfaces implementadas son interfaces serializables

Sintaxis:

public class NotSerializableException 
extends ObjectStreamException

Analicemos los constructores de esta clase antes de

  1. NotSerializableException(): Construye un objeto NotSerializableException.
  2. NotSerializableException(String classname): construye un objeto NotSerializableException con una string de mensaje.

Ejemplo 1:

Java

// Java Program to Illustrate NotSerializableException
// Where Exception Is Thrown
 
// Importing required classes
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
 
// Class 1
// Helper class
class Employee {
 
    // Member variables
    private String id;
 
    // Member methods
 
    // Method 1
    // To get ID of an employee
    public String getId() { return id; }
 
    // Method 1
    // To set ID of an employee
    public void setId(String id)
    {
 
        // this keyword refers to current object itself
        this.id = id;
    }
}
 
// Class 2
// Main Class
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
        throws IOException
    {
 
        // Create FileOutputStream class object  to
        // create a file
        FileOutputStream out
            = new FileOutputStream("employee.dat");
 
        // Similarly creating ObjectOutputStream class
        // object
        ObjectOutputStream outputStream
            = new ObjectOutputStream(out);
 
        // Creating objects of class 1
        Employee obj = new Employee();
 
        // Assifning ID to an employee
        obj.setId("001");
 
        // Writing objects to stream
        outputStream.writeObject(obj);
 
        // Good practice is always to
        // Close the stream using close() method
        outputStream.close();
    }
}

Producción : 

Errors in Code
Exception in thread "main" java.security.AccessControlException: access denied ("java.io.FilePermission" "employee.dat" "write")
at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.base/java.security.AccessController.checkPermission(AccessController.java:897)
at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:322)
at java.base/java.lang.SecurityManager.checkWrite(SecurityManager.java:752)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:225)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:126)
at NotSerializableExceptionExample.main(NotSerializableExceptionExample.java:21)                                                    

Cómo lidiar con la excepción NotSerializableException

  • La solución más simple es encontrar la clase que lanza la excepción y hace que implemente la interfaz Serializable. Sin embargo, esto puede no ser factible si la clase que genera la excepción pertenece a una biblioteca de terceros.
  • En caso de que la clase se refiera a objetos no serializables y estos objetos no deban serializarse, puede declarar estos objetos como transitorios. Una vez que un campo de una clase se declara como transitorio, el tiempo de ejecución serializable lo ignora.

Ejemplo 2:

Java

// Java Program to Illustrate NotSerializableException
// where No Exception is Thrown Using Serializable interface
 
// Importing input output class
import java.io.Serializable;
 
// By implementing Serializable interface
// we are allowing Student object to
// be stored in TestFile.txt
 
// Class 1
// Helper class extending to Serializable interface
class Student implements Serializable {
 
    // Member variables of this class
    int id;
    String name;
 
    // Constructor of this class
    public Student(int id, String name)
    {
        this.id = id;
        this.name = name;
    }
}
 
// Class 2
// Main class
class Persist {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // try block to check for exceptions
        try {
 
            // Creating the object
            Student s1 = new Student(007, "Test");
 
            // Creating stream and writing the object
            FileOutputStream fout
                = new FileOutputStream("TestFile.txt");
            ObjectOutputStream out
                = new ObjectOutputStream(fout);
 
            out.writeObject(s1);
            out.flush();
 
            // Closing the stream to free up memory space
            // using close() method
            out.close();
 
            // Display command to shown proper execution of
            // a program
            System.out.println(
                "Object stored successfully");
        }
 
        // Catch block to handle the exceptions
        catch (Exception e) {
 
            // Print and display the exception on the
            // console
            System.out.println(e);
        }
    }
}

 
 
Producción:

Object stored successfully

Publicación traducida automáticamente

Artículo escrito por praveen13kulkarni y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *