目标:Java 对象的深拷贝(或克隆)
建议的方法之一(几乎在任何地方)都是使用 Jackson:
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);
Tatu Saloranta 回答:
第二种方式应该更有效一些,因为它只创建和使用 逻辑令牌流,但不必对 JSON 进行编码,然后将其解码(解析)到令牌流或从令牌流中解码(解析)。所以这接近最佳值 杰克逊。
唯一能让它变得更加优化的就是直接 使用
(这是 Jackson 本身用于缓冲的)。比如:TokenBuffer
TokenBuffer tb = new TokenBuffer(new ObjectMapper(), false);
mapper.writeValue(tb, myPojo);
MyPojo copy = mapper.readValue(tb.asParser(), MyPojo.class);
这将进一步消除树模型的构建和遍历。我不知道它会产生多大的差异,但代码并不多。
谢谢塔图:)
我在迭代过程中复制了我的“valueNode”,并使用 ObjectMapper 制作了它的副本,现在“copyJsonNode”是“valueNode”的副本,我需要进一步实现它。
if (entry.getKey().equalsIgnoreCase("admin")) {
JsonNode valueNode = entry.getValue();
String copyjson = valueNode.toString();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode copyJsonNode = objectMapper.readTree(copyjson);
....}