clone()
method and set each field manually. This can be pretty cumbersome to implement for complex objects or if you have to do this for a lot of them.A simpler way to deep copy an object is to serialize it and then deserialize to get a new instance.
Let's check out a few examples.
Deep Copy using Spring's SerializationUtils
//import org.springframework.util.SerializationUtils;
byte[] sourceInBytes = SerializationUtils.serialize(sourceInstance);
Object newInstance = SerializationUtils.deserialize(sourceInBytes);
Since we are using java serialization here, the Class needs to implement
Serializable
.
Deep Copy using Apache Commons Lang SerializationUtils
//import org.apache.commons.lang.SerializationUtils
Object newInstance = SerializationUtils.clone(sourceInstance);
Just like above example, this one needs the POJO to implement
Serializable
.Deep Copy through JSON serialization
//import org.codehaus.jackson.map.ObjectMapper;
//import org.codehaus.jackson.map.ObjectMapper.DefaultTyping;
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(DefaultTyping.NON_FINAL);
String jsonSource = mapper.writeValueAsString(sourceInstance);
MyClass newInstance = mapper.readValue(jsonSource, MyClass.class);
The advantage with JSON is that the Class need not implement a Serializable interface. It just needs to be a POJO with a public no-arg constructor and getters/setters for the properties. enableDefaultTyping here ensures that the Polymorphic Type Handling is taken care of.