我目前正在处理的项目中有许多对象进行了序列化,以获得现有对象的深度拷贝。这在单次调用时是可以正常工作的,但在某些情况下,组件之间存在多次调用,每次可能达到100、200甚至1000次,在这种情况下,我们面临性能问题。
历史原因是为了防止两个不同的组件在不同的功能下对同一对象进行更改,例如Swing UI中的更改应该在保存或同步按钮被按下之前不会更改后端的对象值。
我们的代码库非常庞大,我认为如果我基于反射编写克隆,它将比序列化更快,但由于对象层次结构复杂或其他原因,此方法甚至更慢。
我还尝试使用CloneUtils(sourceforge项目),它也更慢(我们根本没有使用Hibernate)。Spring BeanUtils不是一个选择(我从文档中推断它只使用bean,即内省,并且如果使用它,如果任何字段使用非标准访问器公开,我们将无法复制这些字段)。
有人有什么想法,可以在保持不同副本的同时提高性能。我们有一种选项,如果我们提供自己的复制方法,而不是序列化,那么将加速事情,但这样做的缺点是每次更新这些方法,并且如果我们忘记了,可能会丢失功能。
历史原因是为了防止两个不同的组件在不同的功能下对同一对象进行更改,例如Swing UI中的更改应该在保存或同步按钮被按下之前不会更改后端的对象值。
我们的代码库非常庞大,我认为如果我基于反射编写克隆,它将比序列化更快,但由于对象层次结构复杂或其他原因,此方法甚至更慢。
我还尝试使用CloneUtils(sourceforge项目),它也更慢(我们根本没有使用Hibernate)。Spring BeanUtils不是一个选择(我从文档中推断它只使用bean,即内省,并且如果使用它,如果任何字段使用非标准访问器公开,我们将无法复制这些字段)。
有人有什么想法,可以在保持不同副本的同时提高性能。我们有一种选项,如果我们提供自己的复制方法,而不是序列化,那么将加速事情,但这样做的缺点是每次更新这些方法,并且如果我们忘记了,可能会丢失功能。
clone()
是一个不错的选择(我喜欢clone()
,无论听到什么)。没有任何外部库可以明显超越Java的(反)序列化,因为它依赖于反射(在最好的情况下可能会选择代码生成,但仍然...)。 - bestsss