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

时间:2016-08-22 12:44:45

标签: java rmi serializable

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

在讲座期间,教授强调只允许类实现 Serializable ,它们必须通过网络传递值。

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

我不知道如果有任何不足之处,因为如果您从未真正通过网络发送序列化/反序列化将永远不会发生。

4 个答案:

答案 0 :(得分:7)

  

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

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

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

Joshua Bloch在他的书Effective Java中阐述了这一点。

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

如果类型实现Serializable,则它具有 potential 被序列化。如果该类型的实例被序列化,您可以通过修改它的实现来破坏代码。

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

- properly versioning可序列化类型可以避免这种情况,但由于可能会对没有合同更改的类型进行版本控制(没有编译时错误处理支持通知()),最好将显式版本保持最小,以避免在设计中添加excess complexity

答案 1 :(得分:2)

  

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

不必要地执行Serializable不会受到惩罚。如果你从不序列化对象,那么只是因为你添加了implements Serializable而没有任何反应。如果你对它进行序列化,它可以工作而不是失败。这不是惩罚。

为什么教授强调这是一个谜。问他。除了序列化之外没有任何开销,如果你通过RMI按值传递对象,你没有任何选择但是来实现Serializable,所以没有什么可以评估开销。这没有意义。

答案 2 :(得分:2)

我理解教授"只允许类实现 Serializable,它们必须通过网络传递价值"不同。我认为这个想法是,如果你必须以这种方式使用一个类,那么自己实现writeObject,readObject和readObjectNoData,这可能比默认实现更有效。

答案 3 :(得分:0)

如果有人后来想要对可序列化类进行子类化,那么他们必须确保他们的类确实可以序列化。这可能需要他们不想做的努力。

说你有:

public class YourClass implements Serializable {
}

现在,如果我写:

class MyClass extends YourClass {
    private SomeoneElsesClass myField;
}

SomeoneElsesClass 可序列化,我的FindBugs将标记myField,并显示消息“可序列化类中的非瞬态非可序列化实例字段”。我试图保持我的代码清除警告消息,但在这种情况下,我不能。

我经常专攻Swing课程。有时我想拥有非可序列化类的实例字段,这基本上会在我的代码中引入错误。在现实生活中,我只收到一条警告信息,只要该对象实际上没有被序列化,它就可以工作;我仍然对这些警告信息感到恼火。