Showing posts with label JSON. Show all posts
Showing posts with label JSON. Show all posts

Deep Copy Java Objects through Serialization

When it comes to deep copy or cloning an object, the first thing that comes to mind is to override the 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

 ObjectMapper mapper = new ObjectMapper();
 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.

JSON Property Name Customization in Jackson using PropertyNamingStrategy

Jackson is one of the most popular java libraries for serialization/deserialization of POJOs to/from JSON. By default, Jackson derives the JSON element names from the getter/setter method names of the POJO. e.g. getActorName() is translated to actorName in the resulting JSON.