java: super.clone() 与 Jackon ObjectMapper
java: super.clone() with Jackon ObjectMapper
所以我理解在实施 clone()
方法时,您应该首先调用 super.clone()
以便(潜在的)超级 class 可以完成它的工作,然后进行您自己的克隆。这一切都确保来自 superclass 的变量没有被列出/没有被克隆。
现在如果我使用 Jacksons ObjectMapper 进行克隆会怎样:
return objectMapper.readValue(objectMapper.writeValueAsString(this), Mail.class);
我决定这样做,因为我的对象 (Mail
) 已经完全可以与 json 相互转换,这基本上是克隆。
在这种情况下调用 super.clone() 是没用的吧?杰克逊无论如何都会在设置超级变量时复制它,所以 super.clone()
的结果不会做任何事情。
我是不是遗漏了什么?
问候,
克里斯
In this case calling super.clone() is useless right?
不安静。 Jackson
将在幕后做所有事情来正确实例化您的对象,但仅基于 public 字段或您配置为可序列化为 JSON。 有关私有字段的信息将丢失。
class A {
public int x = 10;
private int y = 100; // this info will be lost when cloning with Jackson
}
虽然这种方法在小型项目上非常适用。我认为,如果您将它用作大型克隆方法,它会产生太多开销。太多的去序列化和序列化会变得昂贵。
你应该考虑使用 proxy pattern to implement cloning in java. This 也有帮助。
Java 的 clone
方法和 Jackson 没有任何关系。所以你甚至不需要实现 clone
方法。
序列化和反序列化对象一直是复制对象的常用方法。请记住,它也有缺点。
所以我理解在实施 clone()
方法时,您应该首先调用 super.clone()
以便(潜在的)超级 class 可以完成它的工作,然后进行您自己的克隆。这一切都确保来自 superclass 的变量没有被列出/没有被克隆。
现在如果我使用 Jacksons ObjectMapper 进行克隆会怎样:
return objectMapper.readValue(objectMapper.writeValueAsString(this), Mail.class);
我决定这样做,因为我的对象 (Mail
) 已经完全可以与 json 相互转换,这基本上是克隆。
在这种情况下调用 super.clone() 是没用的吧?杰克逊无论如何都会在设置超级变量时复制它,所以 super.clone()
的结果不会做任何事情。
我是不是遗漏了什么?
问候,
克里斯
In this case calling super.clone() is useless right?
不安静。 Jackson
将在幕后做所有事情来正确实例化您的对象,但仅基于 public 字段或您配置为可序列化为 JSON。 有关私有字段的信息将丢失。
class A {
public int x = 10;
private int y = 100; // this info will be lost when cloning with Jackson
}
虽然这种方法在小型项目上非常适用。我认为,如果您将它用作大型克隆方法,它会产生太多开销。太多的去序列化和序列化会变得昂贵。
你应该考虑使用 proxy pattern to implement cloning in java. This 也有帮助。
Java 的 clone
方法和 Jackson 没有任何关系。所以你甚至不需要实现 clone
方法。
序列化和反序列化对象一直是复制对象的常用方法。请记住,它也有缺点。