/* * @(#)EvolutionExampleOriginalClass.java 1.1 97/11/18 * * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved. * * This software is the confidential and proprietary information of Sun * Microsystems, Inc. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Sun. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING * THIS SOFTWARE OR ITS DERIVATIVES. * * */ import java.io.*; import java.util.*; /** * When Java objects use serialization to store objects, the potential arises * that the version of the class reading the data is different from the version * of class that wrote that data * * This example demonstrates some of the compatible changes that Serialization * handles without class-specific methods * How to Run: * * Compile Original Class: * javac EvolutionExampleOriginalClass.java * Run Original Class with serialization flag: * java EvolutionExampleOriginalClass -s * Compile Evolved Class: * javac EvolutionExampleEvolvedClass.java * Run Evolved Class with deserialization flag: * java EvolutionExampleEvolvedClass -d * * This tests compatibility in one direction only. Perform the same steps in * the other direction to see bidirectional compatibility. * * Compiled and Tested with JDK1.1.4 & JDK1.2 * This file contains the original class. * The evolved class is in file called EvolutionExampleEvolvedClass.java */ public class EvolutionExampleOriginalClass { /** * There are two options: either a user can serialize an object or * deserialize it. (using the -s or -d flag). These options allow * for the demonstration of bidirection readability and writeability * between the original and the evolved class. In other words, * one can serialize an object here and deserialize it with the evolved * class or vice versa. */ public static void main(String args[]) { boolean serialize = false; boolean deserialize = false; /* * see if we are serializing or deserializing. * The ability to deserialize or serialize allows * us to see the bidirectional readability and writeability */ if (args.length == 1) { if (args[0].equals("-d")) { deserialize = true; } else if (args[0].equals("-s")) { serialize = true; } else { usage(); System.exit(0); } } else { usage(); System.exit(0); } AClass serializeclass = new AClass(10, "serializedByOriginalClass"); AClass deserializeclass = null; /* * Serialize the original class if that's the option chosen */ if (serialize) { try { FileOutputStream fo = new FileOutputStream("evolve.tmp"); ObjectOutputStream so = new ObjectOutputStream(fo); so.writeObject(serializeclass); so.flush(); } catch (Exception e) { System.out.println(e); System.exit(1); } } /* * Deserialize, if that's the option chosen and print the name * of the object, which will allow us to see who serialized the * object, the original class or the evolved class file */ if (deserialize) { try { FileInputStream fi = new FileInputStream("evolve.tmp"); ObjectInputStream si = new ObjectInputStream(fi); deserializeclass = (AClass) si.readObject(); } catch (Exception e) { System.out.println(e); System.exit(1); } /* * Print out to see that it is indeed the same object as it was * when it was serialized (depending on whether it was the original * class that serialized it or the evolved class) */ System.out.println("Now printing deserialized object's name: "); System.out.println(); System.out.println("name: " + deserializeclass.name); System.out.println(); } } /** * Prints out the usage */ static void usage() { System.out.println("Usage:"); System.out.println(" -s (in order to serialize)"); System.out.println(" -d (in order to deserialize)"); } } /* * Original Class * will evolve later (see the other file) */ class AClass implements Serializable { // some data fields. private int num; String name; static Hashtable ht = new Hashtable(); // ... // ... // ... AClass(int n, String s) { num = n; name = s; } // some methods... // ... // ... /* * These writeObject and readObject merely defaultwriteObject and * defaultreadObject - so they don't do anything.. but they are placed * here so that we can show that we can remove them in the evolved * class without any effect. */ private void writeObject(ObjectOutputStream s) throws IOException { s.defaultWriteObject(); } /* * readObject - just calls defaultreadObject() */ private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); } }