On Fri, Apr 20, 2018 at 7:06 AM, Rad Akefirad <[email protected]> wrote: > Hi, > > I asked this question on SO and to my surprise I didn't get any answer. Is > there anyone here know the answer. > Thanks in advance. > > Regards, > Rad > > PS: the post is: > >> 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 any way (e.g. performance)? is there >> any drawbacks? >> >> >> >> MyPojo myPojo = new MyPojo(); >> ObjectMapper mapper = new ObjectMapper(); >> MyPojo newPojo = mapper.treeToValue(mapper.valueToTree(myPojo), >> MyPojo.class);
(note: thank you for including code from question here -- much appreciated!) 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. I wonder if it'd make sense to even expose this as new method in `ObjectMapper`.... like `deepCopyValue(value)`? If so, feel free to file an issue for `jackson-databind`: I could easily add it, although would need to go to new minor/major version, being API addition. -+ Tatu +- -- You received this message because you are subscribed to the Google Groups "jackson-user" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. For more options, visit https://groups.google.com/d/optout.
