在Java中,使用序列化实现克隆方法是一种好的做法吗?

在Java中,使用序列化实现克隆方法是一种好的做法吗?,java,serialization,clone,Java,Serialization,Clone,我在网上看到了一些教程,其中序列化和随后的反序列化用于在Java中实现深度克隆。 我的感觉是,这是一个快速实现的解决方案,因此很普遍,但可能有我目前看不到的警告 这是实现clone()的好方式吗?不是很慢吗?深度克隆真的应该这样做吗?还有什么更好的办法 在Java中,使用 序列化 如果使用序列化来克隆对象,则必须取消序列化该序列化对象才能创建克隆对象。它会执行两个操作,其中第二个操作似乎是一项开销,因为如果您在手上或使用映射器API(例如:SpringBean、Common apache、Mod

我在网上看到了一些教程,其中序列化和随后的反序列化用于在Java中实现深度克隆。 我的感觉是,这是一个快速实现的解决方案,因此很普遍,但可能有我目前看不到的警告

这是实现
clone()
的好方式吗?不是很慢吗?深度克隆真的应该这样做吗?还有什么更好的办法

在Java中,使用 序列化

如果使用序列化来克隆对象,则必须取消序列化该序列化对象才能创建克隆对象。它会执行两个操作,其中第二个操作似乎是一项开销,因为如果您在手上或使用映射器API(例如:SpringBean、Common apache、ModelMapper、Dozzer…)实现克隆操作,则不应执行第二个操作。
因此,它无疑会对性能产生影响。如果您偶尔进行此处理,我认为这不应该是一个问题(即使这似乎是一个无用的开销,您有其他方法),但如果您经常使用它,我认为可能会有成本。


此外,为什么要通过使用序列化实现
Clonable
来克隆对象,而不是忘记
Cloneable
,这是一个笨拙的API,并且直接使用
反序列化
机制

Java中的
clone()
通常被认为是一个错误(在这个主题上进行谷歌搜索),但是它仍然存在向后兼容性。你不应该使用
clone()
,而是应该实现你自己的复制构造函数。我认为,如果你需要深度克隆,这表明了以下问题:你的域是可变的,你的域太复杂(因为你无法实现复制构造函数)最重要的是,您无法控制您的代码—您不知道域对象可能在何处更改以及如何更改—这就是您需要深度克隆的原因,对吗?关于此方法:速度慢(通过复杂的Java序列化将所有内容转换为字符串格式)和内存消耗(除了这两个对象及其子对象之外,还有一个巨大的字符串对象。我认为这是一个不好的做法,但后来我看到了它的用法:在带有Jackson和Hibernate注释的对象层次结构中,它被用来绕过Hibernate实体管理器的会话,因此在克隆后调用save时,您将创建一个新的记录在数据库中。@Jaroslaw Pawlak:让我们查看
clone()
在这里作为一个概念,并将其视为与复制构造函数相同。我不想讨论两者之间的区别,但要讨论通过序列化实现的复制构造函数是好是坏。问题更多的是,这些不相关的进程(序列化和克隆)是否应该仅仅因为deserialized对象恰好是一个clones对象。这可能会带来很大的开销……不,不应该。克隆只是序列化的一个副作用。正如所解释的,您也知道,它会增加无用的开销。