Serialization and Deserialization in Java | Code Factory


Donate : Link

Medium Blog : Link

Applications : Link

Java Serialization allows us to convert Java Object to a Stream of bytes which we can send through a network or save in a file or even in a DB for future usage. Deserialization is the process of converting a stream of bytes back to Java Object which can be used in our program. We will be implementing java.io.Serializable interface to achieve serialization

The serializable interface in java is a marker interface (method with no body).

Employee.java

package com.codeFactory;

import java.io.Serializable;

/**
 * @author code.factory
 *
 */
public class Employee implements Serializable {

	private int id;
	private String name;

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

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	@Override
	public String toString() {
		return "Employee : [id : " + id + ", name : " + name + "]";
	}
}

SerializableUtility.java

package com.codeFactory;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * @author code.factory
 *
 */
public class SerializableUtility {

	public void serialize(Object object, String filePath) {
		try {
			FileOutputStream fos = new FileOutputStream(filePath);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(object);
			oos.flush();
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public Object deserialize(String filePath) {
		Object object = null;
		try {
			FileInputStream fis = new FileInputStream(filePath);
			ObjectInputStream ois = new ObjectInputStream(fis);
			object = ois.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return object;
	}
}

Main.java

package com.codeFactory;

/**
 * @author code.factory
 *
 */
public class Main {

	final private static String filePath = "Test.txt";
	
	public static void main(String... args) {
		Employee emp = new Employee(1, "Code Factory");
		
		SerializableUtility su = new SerializableUtility();
		su.serialize(emp, filePath);
		
		Employee employee = (Employee) su.deserialize(filePath);
		System.out.println(employee);
	}
}

Output :

Employee : [id : 1, name : Code Factory]

Is sub class Serializable?

If the parent class is Serializable then all the sub class will be Serializable as well.

Person.java

package com.codeFactory;

/**
 * @author code.factory
 *
 */
public class Person extends Employee {

	private String name;

	public Person(String name) {
		super(2, name);
		this.name = name;
	}

	public String getName() {
		return name;
	}

}

Main.java

package com.codeFactory;

/**
 * @author code.factory
 *
 */
public class Main {

	final private static String filePath = "Test.txt";
	
	public static void main(String... args) {
		Employee emp = new Employee(1, "Code Factory");
		Person person = new Person("Person");
		
		SerializableUtility su = new SerializableUtility();
		su.serialize(person, filePath);
		
		Employee employee = (Employee) su.deserialize(filePath);
		System.out.println(employee);
	}
}

Output :

Employee : [id : 2, name : Person]

Other Class Reference in a Serializable class

If we have a non-serializable reference of a class inside a Serializable class, then serialization operation will not be performed.In such case, NonSerializableException will be thrown.

I have changed code of Employee.java and Person.java classes

Employee.java

package com.codeFactory;

import java.io.Serializable;

/**
 * @author code.factory
 *
 */
public class Employee implements Serializable {

	private int id;
	private Person person;

	public Employee(int id, Person person) {
		this.id = id;
		this.person = person;
	}

	public int getId() {
		return id;
	}

	public Person getPerson() {
		return person;
	}

	@Override
	public String toString() {
		return "Employee : [id : " + id + ", person : " + person.getName() + "]";
	}
}

Person.java

package com.codeFactory;

/**
 * @author code.factory
 *
 */
public class Person {

	private String name;

	public Person(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

}

Main.java

package com.codeFactory;

/**
 * @author code.factory
 *
 */
public class Main {

	final private static String filePath = "Test.txt";
	
	public static void main(String... args) {
		Employee emp = new Employee(1, new Person("Code Factory"));
		
		SerializableUtility su = new SerializableUtility();
		su.serialize(emp, filePath);
		
		Employee employee = (Employee) su.deserialize(filePath);
		System.out.println(employee);
	}
}

Output :

java.io.NotSerializableException: com.codeFactory.Person
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at com.codeFactory.SerializableUtility.serialize(SerializableUtility.java:18)
	at com.codeFactory.Main.main(Main.java:15)

One thought on “Serialization and Deserialization in Java | Code Factory”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s