在Java中实现Serializable的惩罚?

时间:2012-05-03 09:30:26

标签: java performance serializable

是否需要加罚

implements Serializable

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

5 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:24)

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

进一步的细节:

  • 每个对象实例的大小没有增加
  • 班级本身的规模略有增加,但由于这是一次性成本,因此在大量实例上摊销时,这是微不足道的。
  • 对于需要在运行时进行接口检查的任何事物(反射,instancof查找,内联缓存的额外压力等),可能会有轻微的额外运行时成本。同样,对于大多数目的而言,这可能是微不足道的。
  • Serializable是标记接口,没有需要实现的方法。其他标记接口示例包括:Clonable,SingleThreadModel,Event listener。

答案 2 :(得分:24)

除非您执行序列化/反序列化,否则没有性能影响,但在api设计方面存在折衷。

来自约书亚布洛赫的Effective java

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

这些适用于您的程度取决于您的用例。

答案 3 :(得分:1)

您应该始终首先考虑维护开销。部署的应用程序在其生命周期内的成本可能是开发它的成本的几倍。

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

如果您确实需要将其作为Serializable,则无法将其与非Serializable版本进行比较,因为只有第一种情况才会真正完成所需的工作。

答案 4 :(得分:0)

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

唯一的建议是建议使用static final long serialVersionUID来帮助序列化API。每个序列化类花费一个long值。

您可能想查看this article about Java Serialization API。它详细描述了序列化/反序列化的大部分注意事项。