38

有加罚吗

implements Serializable

到 Java 类?对实例化对象的大小或性能的影响?

4

5 回答 5

27

除非您执行序列化/反序列化,否则不会对性能产生影响,但在 api 设计方面需要权衡取舍。

来自Joshua Bloch 的Effective java

  • 实现 Serializable 的一个主要成本是它降低了在类发布后更改其实现的灵活性
  • 实现 Serializable 的第二个成本是它增加了错误和安全漏洞的可能性
  • 实现 Serializable 的第三个成本是它增加了与发布类的新版本相关的测试负担

这些在多大程度上适用于您取决于您​​的用例。

于 2012-05-03T09:39:11.937 回答
25

除非您/其他人实际序列化/反序列化,否则不会有任何影响。Serializable只是一个标记界面。

它可能只会将生成的字节码的大小增加几个字节。

于 2012-05-03T09:32:24.223 回答
25

成本接近于零,不值得关注。

一些进一步的细节:

  • 每个对象实例的大小没有增加
  • 类本身的大小略有增加,但由于这是一次性成本,因此在大量实例中摊销时是微不足道的
  • 对于需要在运行时进行接口检查的任何事情(反射、instancof 查找、内联缓存的额外压力等),可能会有一点额外的运行时成本。同样,这对于大多数用途来说可能是微不足道的。
  • Serializable 是一个标记接口,没有需要实现的方法。其他标记接口示例有:Clonable、SingleThreadModel、事件监听器。
于 2012-05-03T09:37:02.690 回答
2

您应该始终首先考虑维护开销。已部署应用程序的实时成本可能是开发成本的数倍。

在这种情况下,使类可序列化但实际上并未用于序列化的成本可能会导致错误或混乱,这远远超过性能成本。例如,说它需要 1 分钟或某人的时间来确定不需要 Serializable,这可能比应用程序产生的几纳秒额外启动时间要多得多。

如果您确实需要它是可序列化的,则无法将其与不可序列化的版本进行比较,因为只有第一种情况才能真正完成所需的工作。

于 2012-05-03T10:45:01.627 回答
0

Serializable只是一个“标记”界面。它不需要您实现任何方法。

唯一的一点是建议有一个static final long serialVersionUID帮助序列化的API。long每个序列化类需要一个值。

您可能想查看这篇关于 Java 序列化 API的文章。它详细描述了序列化/反序列化的大部分注意事项。

于 2012-05-03T09:40:44.793 回答