/home/wpollock1/public_html/AJava/DeepCopy.java

// Found at <http://javatechniques.com/blog/faster-deep-copies-of-java-objects/>.
// Read on 10/19/2010.  Author: Philip Isenhour
//
// Adapted (and modified) on 10/2010 by Wayne Pollock, Tampa Florida USA

import java.io.*;
import java.util.*;

/**
 * Utility for making deep copies (vs. clone()'s shallow copies) of
 * objects. Objects are first serialized and then deserialized. Error
 * checking is fairly minimal in this implementation. If an object is
 * encountered that cannot be serialized (or that references an object
 * that cannot be serialized) an error is printed to System.err and
 * null is returned. Depending on your specific application, it might
 * make more sense to re-throw the (caught) exception.
 */

public class DeepCopy {

    /**
     * Returns a copy of the object, or null if the object cannot
     * be serialized.
     */
    public static Object copy ( Object orig ) {
        Object obj = null;
        try {
            // Write the object out to a byte array:
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bos);
            out.writeObject(orig);
            out.flush();
            out.close();

            // Make an input stream from the byte array and read
            // a copy of the object back in:
            ObjectInputStream in = new ObjectInputStream(
                new ByteArrayInputStream(bos.toByteArray()));
            obj = in.readObject();
        }
        catch(IOException e) {
            e.printStackTrace();
        }
        catch(ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
        }
        return obj;
    }

}

// Test class: makes an array of Date objects, tries to deepCopy it:

class DeepCopyDemo {
   @SuppressWarnings("deprecation")  // For Date.setYear
   public static void main ( String [] args ) {
      Date [] dates = new Date[]{ new Date(), new Date() };
      Date [] dateCopy = (Date[]) DeepCopy.copy( dates );

      // Now we change one of the date object in the original:
      dates[1].setYear(101);  // Sets the year to 2001

      // Now see if the copy has the old or changed date:
      System.out.println( "Original Date array: " + Arrays.toString( dates ) );
      System.out.println( "Date array copy:     " + Arrays.toString( dateCopy ) );

      if ( dates[1].getYear() != dateCopy[1].getYear() )
         System.out.println( "\nDeep copy successful!" );
      else
         System.out.println( "\nDeep copy failled (shallow copy was created)!" );
   }
}