Deep Copy using Jackson: String or JsonNode

Rad :

Objective: deep copy (or clone) of a Java object
One of the suggested ways (almost everywhere) to do it is using Jackson:

MyPojo myPojo = new MyPojo();
ObjectMapper mapper = new ObjectMapper();
MyPojo newPojo = mapper.readValue(mapper.writeValueAsString(myPojo), MyPojo.class);

Question: is the following better? in terms of performance? is there any drawbacks?

MyPojo myPojo = new MyPojo();
ObjectMapper mapper = new ObjectMapper();
MyPojo newPojo = mapper.treeToValue(mapper.valueToTree(myPojo), MyPojo.class);
Rad :

Answered by Tatu Saloranta:

Second way should be bit more efficient since it only creates and uses logical token stream but does not have to encode JSON and then decode (parse) it to/from token stream. So that is close to optimal regarding Jackson.

About the only thing to make it even more optimal would be to directly use TokenBuffer (which is what Jackson itself uses for buffering). Something like:

TokenBuffer tb = new TokenBuffer(); // or one of factory methods
mapper.writeValue(tb, myPojo);
MyPojo copy = mapper.readValue(tb.asParser(), MyPojo.class);

This would further eliminate construction and traversal of the tree model. I don't know how big a difference it'll make, but is not much more code.

Thanks Tatu :)

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=466968&siteId=1