不必要地实现 Serializable 的惩罚是什么?
What is the penalty for unnecessarily implementing Serializable?
我需要为我的分布式系统 class 开发一个 Java RMI 应用程序。
在讲座中,教授强调只让classes实现Serializable,这些必须通过网络进行值传递。
这意味着让太多 classes 实现 Serializable 有一些缺点或惩罚。 类 不需要通过网络发送。
我看不出有什么缺点,因为如果您从未真正通过网络发送它,serialization/deserialization 就永远不会发生。
What is the penalty for unnecessarily implementing Serializable?
不必要地实施 Serializable
不会受到惩罚。如果您从不序列化该对象,则不会因为您添加了 implements Serializable
而发生任何事情。如果你确实序列化它,它会起作用而不是失败。那不是点球。
教授为什么强调这一点是个谜。问他。除了序列化时没有其他开销,如果您通过 RMI 按值传递对象,您没有任何选择 但 来实现 Serializable
,所以没有什么评估开销。没有意义。
如果以后有人想要子class 您的可序列化 class,他们将必须确保他们的 class 确实也是可序列化的。这可能需要他们不想做的努力。
假设你有:
public class YourClass implements Serializable {
}
现在如果我写:
class MyClass extends YourClass {
private SomeoneElsesClass myField;
}
和 SomeoneElsesClass
不可 可序列化,我的 FindBugs 将标记 myField
消息“可序列化 [= 中的非瞬态不可序列化实例字段” 26=]”。我试图让我的代码远离警告消息,但在这种情况下,我做不到。
我经常专攻 Swing classes。有时我想拥有不可序列化 classes 的实例字段,这基本上会在我的代码中引入错误。在现实生活中,我只会收到一条警告消息,只要对象实际上没有被序列化,它就可以工作;我仍然对那些警告消息感到恼火。
only let classes implement Serializable that have to be passed by value over the network.
您的教授建议您尽量减少在严格需要的地方使用Serializable
。
这是因为序列化是 leaking implementation 的有力候选者。实施 Serializable
显示了序列化的意图(即使对象从未真正序列化),这强加了开发人员在修改这些 class 时应谨慎以避免破坏软件的想法。
Joshua Bloch 在他的书中介绍了这一点 Effective Java。
当你序列化一个对象时,如果没有特殊处理†,它被实例化的class就不能再被修改。如果修改 class,二进制表示将不再匹配已经序列化的对象。因此,在修改 class 之前序列化的任何对象的反序列化都将失败。
如果一个类型实现了 Serializable
,它就有 被序列化的潜力 。如果该类型的实例被序列化,您可能会通过修改它的实现来破坏代码。
由于没有简单的方法可以确定可序列化类型的实例已被序列化(尽管您可能不打算序列化对象),因此开发人员在修改这些类型的实现时要格外小心。
† - 这可以通过 properly versioning your serializable types, but due to the potential of versioning a type that had no contract change (with no compile time error handling support to notify you), it's best to keep explicit versioning minimal to avoid adding excess complexity 您的设计来避免。
我会以不同的方式理解教授的 "only let classes implement Serializable that have to be passed by value over the network"。我认为这个想法是,如果你必须以这种方式使用 class,那么你自己实现 writeObject、readObject 和 readObjectNoData,这可能比默认实现更有效。
我需要为我的分布式系统 class 开发一个 Java RMI 应用程序。
在讲座中,教授强调只让classes实现Serializable,这些必须通过网络进行值传递。
这意味着让太多 classes 实现 Serializable 有一些缺点或惩罚。 类 不需要通过网络发送。
我看不出有什么缺点,因为如果您从未真正通过网络发送它,serialization/deserialization 就永远不会发生。
What is the penalty for unnecessarily implementing Serializable?
不必要地实施 Serializable
不会受到惩罚。如果您从不序列化该对象,则不会因为您添加了 implements Serializable
而发生任何事情。如果你确实序列化它,它会起作用而不是失败。那不是点球。
教授为什么强调这一点是个谜。问他。除了序列化时没有其他开销,如果您通过 RMI 按值传递对象,您没有任何选择 但 来实现 Serializable
,所以没有什么评估开销。没有意义。
如果以后有人想要子class 您的可序列化 class,他们将必须确保他们的 class 确实也是可序列化的。这可能需要他们不想做的努力。
假设你有:
public class YourClass implements Serializable {
}
现在如果我写:
class MyClass extends YourClass {
private SomeoneElsesClass myField;
}
和 SomeoneElsesClass
不可 可序列化,我的 FindBugs 将标记 myField
消息“可序列化 [= 中的非瞬态不可序列化实例字段” 26=]”。我试图让我的代码远离警告消息,但在这种情况下,我做不到。
我经常专攻 Swing classes。有时我想拥有不可序列化 classes 的实例字段,这基本上会在我的代码中引入错误。在现实生活中,我只会收到一条警告消息,只要对象实际上没有被序列化,它就可以工作;我仍然对那些警告消息感到恼火。
only let classes implement Serializable that have to be passed by value over the network.
您的教授建议您尽量减少在严格需要的地方使用Serializable
。
这是因为序列化是 leaking implementation 的有力候选者。实施 Serializable
显示了序列化的意图(即使对象从未真正序列化),这强加了开发人员在修改这些 class 时应谨慎以避免破坏软件的想法。
Joshua Bloch 在他的书中介绍了这一点 Effective Java。
当你序列化一个对象时,如果没有特殊处理†,它被实例化的class就不能再被修改。如果修改 class,二进制表示将不再匹配已经序列化的对象。因此,在修改 class 之前序列化的任何对象的反序列化都将失败。
如果一个类型实现了 Serializable
,它就有 被序列化的潜力 。如果该类型的实例被序列化,您可能会通过修改它的实现来破坏代码。
由于没有简单的方法可以确定可序列化类型的实例已被序列化(尽管您可能不打算序列化对象),因此开发人员在修改这些类型的实现时要格外小心。
† - 这可以通过 properly versioning your serializable types, but due to the potential of versioning a type that had no contract change (with no compile time error handling support to notify you), it's best to keep explicit versioning minimal to avoid adding excess complexity 您的设计来避免。
我会以不同的方式理解教授的 "only let classes implement Serializable that have to be passed by value over the network"。我认为这个想法是,如果你必须以这种方式使用 class,那么你自己实现 writeObject、readObject 和 readObjectNoData,这可能比默认实现更有效。