使用Jackson:String或JsonNode进行深层复制

时间:2018-04-18 15:43:44

标签: java json jackson clone

目标:深度复制(或克隆)Java对象
建议的方法之一(几乎无处不在)是使用杰克逊:

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

问题:以下是更好的吗?在表现方面?有什么缺点吗?

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

1 个答案:

答案 0 :(得分:5)

Tatu Saloranta回答:

  

第二种方式应该更高效,因为它只能创建和使用   逻辑令牌流,但不必编码JSON,然后将其解码(解析)到令牌流或从令牌流解析。所以这是接近最佳的   杰克逊。

     

关于使其更加优化的唯一方法是直接   使用TokenBuffer(这是杰克逊自己用来缓冲的)。类似的东西:

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

这将进一步消除树模型的构造和遍历。我不知道它会有多大差异,但代码不多。

谢谢Tatu:)