Deep cloning of Serializable objects

The following code snippet shows how to use Object I/O streams to deep clone Serializable objects. The object bytes once written on an ObjectOutputStream can be read back to a new object with all the populated values intact. The only catch is that, because the object is written and then read from a stream, this process is slower then the normal getter-setter approach.

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
* Deep-copy of  Serializable objects
*/
public class SerializableObjectCloner{

public static Object clone(Object original) {
 Object clone = null;
 try {
    //Increased buffer size to speed up writing
    ByteArrayOutputStream bos = new ByteArrayOutputStream(5120);
    ObjectOutputStream out = new ObjectOutputStream(bos);
    out.writeObject(original);
    out.flush();
    out.close();

    ObjectInputStream in = new ObjectInputStream(
            new ByteArrayInputStream(bos.toByteArray()));
    clone = in.readObject();

    in.close();
    bos.close();

    return clone;
 } catch (IOException e) {
    e.printStackTrace();
 } catch (ClassNotFoundException cnfe) {
    cnfe.printStackTrace();
 }

 return null;
}
}

1 Comment

This is exactly the approach I have taken :). I wanted a general utility to deep clone an entire object (graph) based at a business entity object. I took the easy approach of using apache.commons.lang's SerializationUtils; the code becomes:@SuppressWarnings("unchecked") public static T deepClone(T object) { return (T) deserialize(serialize(object)); }Unfortunately as you pointed out this is very slow.

Leave a Reply