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()); } }); } }
