iA


Using Java Serialization

by Vijay Kiran

import java.io.Serializable;
 
public class SerializableClass implements Serializable {
	private static final long serialVersionUID = 8527009390527848344L;
 
	private volatile int volatile_integer = 1;
 
	private transient int transient_int = 1;
 
	public SerializableClass() {
		System.out.println("SerializableClass : constructor ");
		this.volatile_integer = 2;
		this.transient_int = 2;
	}
 
	public void changeInteger() {
		// Takes really long to complete.
		try {
			System.out.println("SerializableClass : changeInteger : try ");
			volatile_integer = 3;
			transient_int = 3;
			Thread.sleep(20000);
		} catch (InterruptedException ie) {
			ie.printStackTrace();
		} finally {
			System.out.println("SerializableClass : changeInteger : finally ");
			volatile_integer = 4;
			transient_int = 4;
		}
 
	}
 
	public int getTransientInteger() {
		return transient_int;
	}
 
	public int getVolatileInteger() {
		return volatile_integer;
	}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
public class MainClass {
	public static void main(String[] args) {
		final SerializableClass sc = new SerializableClass();
 
		try {
 
			new Thread(new Runnable() {
				public void run() {
 
					System.out.println("Thread 1 for calling change integers");
					sc.changeInteger();
 
				}
			}).start();
 
			new Thread(new Runnable() {
 
				public void run() {
					System.out
							.println("Thread 2 for serializing and deserializing the object");
					FileOutputStream fos = null;
					ObjectOutputStream out = null;
					try {
 
						System.out.println("Before Serialization:");
						System.out.println("Value of transient: "
								+ sc.getTransientInteger());
						System.out.println("Value of volatile: "
								+ sc.getVolatileInteger());
 
						fos = new FileOutputStream("c:/object.ser");
						out = new ObjectOutputStream(fos);
						out.writeObject(sc);
						System.out
								.println("Serialization finished!");
 
					} catch (IOException ex) {
						ex.printStackTrace();
					}
 
					SerializableClass sc2 = null;
					FileInputStream fis = null;
					ObjectInputStream in = null;
					try {
						fis = new FileInputStream("c:/object.ser");
						in = new ObjectInputStream(fis);
						sc2 = (SerializableClass) in.readObject();
 
					} catch (IOException ex) {
						ex.printStackTrace();
					} catch (ClassNotFoundException ex) {
						ex.printStackTrace();
					}
 
					System.out.println("After deserialization: ");
					System.out.println("Value of transient: "
							+ sc2.getTransientInteger());
					System.out.println("Value of volatile: "
							+ sc2.getVolatileInteger());
 
				}
			}).start();
 
		} finally {
			System.out.println("Main Thread finally executed ");
		}
 
		Runtime.getRuntime().addShutdownHook(new Thread() {
			@Override
			public void run() {
				System.out.println("In the shutdown Hook :");
				System.out.println("Value of transient: "
						+ sc.getTransientInteger());
				System.out.println("Value of volatile: "
						+ sc.getVolatileInteger());
 
			}
		});
 
	}
}