package org.overture.codegen.runtime.copying; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * 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 have copy(...) re-throw the 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 FastByteArrayOutputStream fbos = new FastByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(fbos); out.writeObject(orig); out.flush(); out.close(); // Retrieve an input stream from the byte array and read // a copy of the object back in. ObjectInputStream in = new ObjectInputStream(fbos.getInputStream()); obj = in.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } return obj; } }