不必要地实施Serializable会受到什么惩罚?

Tho*_*den 7 java rmi serializable

我需要为我的分布式系统类开发Java RMI应用程序.

在讲座期间,教授强调只让类实现Serializable,必须通过网络传递价值.

这意味着让太多的类实现Serializable会有一些缺点或惩罚.不需要通过网络发送的类.

我不知道如果你从未真正通过网络发送序列化/反序列化将永远不会发生任何缺点.

Vin*_*igh 7

只允许类实现必须通过网络传递值的Serializable.

您的教授建议您尽量减少Serializable严格需要的区域的使用.

这是因为序列化是泄漏实现的有力候选者.实现Serializable显示了序列化的意图(即使对象从未实际被序列化),这强加了开发人员在修改这些类时要小心以避免破坏软件的想法.


Joshua Bloch在他的" Effective Java"一书中介绍了这一点.

序列化对象的那一刻,如果没有特殊处理,就无法再修改它实例化的类.如果修改类,则二进制表示将不再与已序列化的对象匹配.因此,在修改类之前序列化的任何对象的反序列化将失败.

如果类型实现Serializable,则它有可能被序列化.如果序列化了该类型的实例,则可以通过修改代码的实现来中断代码.

由于没有简单的方法可以确定序列化类型的实例已被序列化(虽然您可能不打算将对象序列化),但开发人员在修改这些类型的实现时会非常谨慎.


- 通过正确版本化可序列化类型可以避免这种情况,但由于版本控制没有合同更改的类型(没有编译时错误处理支持来通知您),最好将显式版本保持最小化以避免添加你的设计过于复杂.

  • 我认为这个答案值得赞扬,尽管这个问题更多的是一个元问题,而且比你的应用程序使用多少内存更难量化. (2认同)

use*_*421 1

不必要地实现 Serialized 会受到什么惩罚?

不必要的实施不会受到惩罚Serializable。如果您从不序列化该对象,那么仅仅因为您添加了implements Serializable. 如果你序列化它,它会起作用而不是失败。这不是惩罚。

为什么教授强调这一点是一个谜。问他。除了序列化之外没有任何开销,并且如果您通过 RMI 按值传递对象,则除了实现之外别无选择Serializable,因此没有什么可以评估开销。这是没有意义的。