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.

Reply via email to