Serialization and Deserialization in Java

Serialization in java is a mechanism of writing the state of an object into a byte stream and deserialization is the process of converting a stream of bytes back into a copy of the original object. A Java object is serializable if its class or any of its superclasses implements either the java.io.Serializable interface or its subinterface, java.io.Externalizable.

Marker Interface

The Serializable interface is a "marker" interface. This means that it has no methods or fields, but simply "marks" a class as being able to be serialized. When the Java Virtual Machine (JVM) encounters a class that is "marked" as Serializable during a serialization process, the Virtual Machine will assume that it is safe to write to the stream. These all happens somewhat automatically for a programmer. Following are the well-known Marker Interfaces.
  1. rmi.Remote
  2. io.Serializable
  3. lang.Cloneable
Example
import java.io.*; class Student implements Serializable { int id; String name; Student(int id, String name) { this.id = id; this.name = name; } }
Serializing an Object
public class TestClass{ public static void main(String[] args) { try{ Student st = new Student(101,"John"); FileOutputStream fos = new FileOutputStream("student.info"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(st); oos.close(); fos.close(); }catch(Exception e){ System.out.println(e); } } }
Deserialization of Object
public class TestClass{ public static void main(String[] args) { Student st = null; try{ FileInputStream fis = new FileInputStream("student.info"); ObjectInputStream ois = new ObjectInputStream(fis); st = (Student)ois.readObject(); }catch(Exception e){ System.out.println(e); } System.out.println(st.id); System.out. println(st.name); } }

Serialization and Variables

Instance Variables:

These variables are serialized, so during deserialization we will get back the serialized state.

Static Variables:

These variables are not serialized, So during deserialization static variable value will loaded from the class. But, any static variable that is provided a value during class initialization is serialized . However in usual cases, where you would provide the value to a static variable at the main class at run-time would not be serialized.

Transient Variables:

Transient variables are not serialized, so during deserialization those variables will be initialized with corresponding default values.

Super class variables:

If super class also implemented Serializable interface then those variables will be serialized, otherwise it won't serialize the super class variables. While deserializing , Java Virtual Machine (JVM) will run default constructor in super class and populates the default values. Same thing will happen for all superclasses.