Showing posts with label serialVersionUID. Show all posts
Showing posts with label serialVersionUID. Show all posts

Wednesday, 12 October 2016

Java Tutorial : Java IO (Java Serialization - serialVersionUID)

🚀 Enjoying Java Tutorials?

Subscribe to Ram N Java for clean, beginner-friendly core Java tutorials and interview prep!

🔔 Subscribe to Ram N Java

Introduction to serialVersionUID

When you serialize an object in Java, how does the runtime make sure that the class used during deserialization matches the class used during serialization? The answer lies in a special identifier known as serialVersionUID. It functions as a unique version stamp for every serializable class.

Why is serialVersionUID Important?

1. Version Control for Objects

During deserialization, the Java runtime verifies whether the serialVersionUID sent with the serialized stream matches the serialVersionUID of the local class loaded in memory. If the two values match, deserialization succeeds smoothly.

2. Preventing InvalidClassException

If the UID in the stream does not match the UID of the current class definition, the JVM throws an InvalidClassException. This prevents loading corrupted data into incompatible class definitions.

3. Automatic vs Explicit Declaration

If you do not declare a serialVersionUID explicitly, the compiler generates one automatically based on class details (such as fields, methods, and modifiers). However, even a minor change to the class structure alters this computed hash, breaking compatibility with previously saved streams.

Declaring it explicitly gives you full control over class evolution:

private static final long serialVersionUID = 1L;

Best Practices

  • Always declare an explicit serialVersionUID in any class implementing Serializable.
  • Keep the modifier signature strictly as private static final long.
  • Update the UID only when introducing incompatible changes that should reject older serialized objects.

Related Tutorials from Ram N Java


Click here to watch in Youtube :
https://www.youtube.com/watch?v=XRHtOqGSH-Y&list=UUhwKlOVR041tngjerWxVccw

Click the below Image to Enlarge
Java Tutorial : Java IO (Java Serialization - serialVersionUID) 
Java Tutorial : Java IO (Java Serialization - serialVersionUID) 
Java Tutorial : Java IO (Java Serialization - serialVersionUID) 
Java Tutorial : Java IO (Java Serialization - serialVersionUID) 
Java Tutorial : Java IO (Java Serialization - serialVersionUID) 
Java Tutorial : Java IO (Java Serialization - serialVersionUID) 
Java Tutorial : Java IO (Java Serialization - serialVersionUID) 
Java Tutorial : Java IO (Java Serialization - serialVersionUID) 
Employee.java
import java.io.Serializable;

public class Employee implements Serializable
{
    private static final long serialVersionUID = 4676072847340124979L;
    private int id;
    private String name;

    public Employee(int id, String name)
    {
        super();
        this.id = id;
        this.name = name;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

}
Serialization.java
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Serialization
{

    public static void main(String[] args) throws FileNotFoundException,
            IOException, ClassNotFoundException
    {
        Serialization serialization = new Serialization();
        serialization.writeEmployeeObject();
    }

    private void writeEmployeeObject() throws FileNotFoundException,
            IOException
    {
        FileOutputStream fileOutputStream = null;
        ObjectOutputStream objectOutputStream = null;
        try
        {
            fileOutputStream = new FileOutputStream("employee.ser");
            objectOutputStream = new ObjectOutputStream(fileOutputStream);

            Employee employee = new Employee(101, "Peter");

            /*
             * Write the specified object to the
             * ObjectOutputStream.
             */
            objectOutputStream.writeObject(employee);
            System.out
                    .println("Successfully written employee object to the file.\n");
        }
        finally
        {

            if (objectOutputStream != null)
            {
                /*
                 * Closing a ObjectOutputStream will also
                 * close the OutputStream instance to which
                 * the ObjectOutputStream is writing.
                 */
                objectOutputStream.close();
            }
        }

    }

}
Output
Successfully written employee object to the file.

employee.ser

DeSerialization.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeSerialization
{

    public static void main(String[] args) throws FileNotFoundException,
            IOException, ClassNotFoundException
    {
        DeSerialization deSerialization = new DeSerialization();
        deSerialization.readEmployeeObject();
    }

    private void readEmployeeObject() throws IOException,
            FileNotFoundException, ClassNotFoundException
    {
        FileInputStream fileInputStream = null;
        ObjectInputStream objectInputStream = null;

        try
        {
            fileInputStream = new FileInputStream("employee.ser");
            objectInputStream = new ObjectInputStream(fileInputStream);

            /*
             * Read an object from the ObjectInputStream.
             */
            Employee employee = (Employee) objectInputStream.readObject();
            System.out
                    .println("Successfully read employee object from the file.\n");

            System.out.println("Id  = " + employee.getId());
            System.out.println("Name = " + employee.getName());

        }
        finally
        {

            if (objectInputStream != null)
            {
                /*
                 * Closing a ObjectInputStream will also
                 * close the InputStream instance from which
                 * the ObjectInputStream is reading.
                 */
                objectInputStream.close();
            }
        }

    }

}
Output
Successfully read employee object from the file.

Id  = 101
Name = Peter
Click the below link to download the code:
https://sites.google.com/site/ramj2eev1/home/javabasics/JavaIODemo_Serialization_serialVersionUID_App.zip?attredirects=0&d=1

Github Link:
https://github.com/ramram43210/Java/tree/master/BasicJava/JavaIODemo_Serialization_serialVersionUID_App

Bitbucket Link:
https://bitbucket.org/ramram43210/java/src/9f822df4c81f286daa095d86846058f3a9c16303/BasicJava/JavaIODemo_Serialization_serialVersionUID_App/?at=master

See also:
  • All JavaEE Viedos Playlist
  • All JavaEE Viedos
  • All JAVA EE Links
  • Servlets Tutorial
  • All Design Patterns Links
  • JDBC Tutorial
  • Java Collection Framework Tutorial
  • JAVA Tutorial
  • Kids Tutorial
  • Tutorials