【问题标题】:Java: Serialization performance for deep copy?Java:深拷贝的序列化性能?
【发布时间】:2012-05-14 09:37:24
【问题描述】:

我需要为我的一个项目深度复制 Java 对象;我想知道是否可以为此使用序列化。

对象相当小(每个生产中使用序列化,或者考虑到序列化的性能,这仍然是一个非常糟糕的主意?

如果这仍然是一个坏主意,我可以考虑为每个此类使用复制构造函数/静态复制方法来提高性能。还有其他方法吗?

【问题讨论】:

  • 对于每天会被调用几次的东西,性能实际上是无关紧要的,除非你假设你的对象图的序列化需要超过 8 个小时。
  • +1。在考虑其他解决方案之前,先测量一下这段快速编写代码的时间。是的,它很慢。但可能还不足以让您注意到它。如果需要,您可以在以后轻松更换它。
  • @EJP,谢谢。我以前从未在生产中这样做过,所以试图找出是否有人以前做过,以及其中面临的任何性能问题。
  • “是的,它很慢”。相比什么?正是像这样没有内容、毫无意义的陈述给 OP 造成了这种困境。在过去的 15 年里,它并没有被部署到数百万个应用程序中,速度并不慢。
  • 正如 EJP 所说,如果您的例程应该只被调用几次,则性能不应该受到关注。您可以序列化您的对象,或者如果您的对象更大并且您不需要包含的全部数据,那么您可能可以只提取和序列化所需的数据集而不是整个对象集。稍后,您可以在需要时使用工厂从提取的数据中重建对象集。

标签: java performance serialization cloning


【解决方案1】:

也许吧。性能不会成为问题 - 依赖关系会。

序列化的常见问题是,对应用程序中某些核心类的无害引用可以为您提供所有生命实例的 90% 的副本,因为它们突然变得可访问。所以你必须非常小心transient 和你使用的引用。

更糟糕的是,如果您需要序列化以进行深度复制和真实状态保存,您最终可能会遇到不兼容的目标:

  • 深拷贝需要快速
  • 深拷贝可以处理开放资源(数据库连接)
  • 状态保存需要处理 API 演变(状态存储在磁盘上,可以使用新版本的代码恢复)。
  • 使用可读的表单可以节省状态(因此人类可以修复错误)

因此,使用copy constructors 通常比使用“聪明的黑客”更好,即使它现在可能会为您节省一些/很多时间。

【讨论】:

  • 为什么深拷贝和真实状态保存不兼容?
  • @Thalatta 据我了解,“深拷贝”会在内存中创建一个您可以立即使用的工作副本。 “状态保存”是指将某些对象的状态持久化到磁盘上,以便以后恢复。这意味着深层复制可以处理数据库连接等引用,而状态保存则不能。深拷贝需要快速,状态保存必须确保即使对象发生变化(代码演化)也可以恢复状态。
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多