2
 class Parent implements Serializable{

      ........
 }

 class Child extends Parent{

      private void writeObject(ObjectOutputStream oos) throws IOException {
            throw new NotSerializableException();
      }
      private void readObject(ObjectOutputStream oos) throws IOException {
            throw new NotSerializableException();
      }

 }

上面的代码显示了Serializable如果父级已经实现,子级如何避免Serializable。这似乎是一个糟糕的设计,并且在某些方面令人困惑,所以我想知道您在什么情况下会考虑这样做?

4

3 回答 3

4

如果父母被标记为,Serializable那么每个孩子都应该在设计上是可序列化的。否则,糟糕的设计选择不是你如何通过抛出异常来禁止序列化,而是不应该的事实ParentSerializable

由于无法删除在祖先类中实现的接口,因此您别无选择:引发异常总是比序列化不应该序列化的东西更好,这会让您认为一切正常,直到出现问题与序列化的数据。禁止序列化总是有理由的:只需在子类中添加一个不可序列化的字段就足够了(除非您可以使用它,transient但如果该字段包含关键信息,这并不总是可能的)。

于 2012-06-20T18:25:50.717 回答
2

发生这种情况的可能原因是父类最初可能没有设计为父类,而只是普通的可序列化类。所以后来,有人创建了一个不可序列化的子类——这并不意味着父类有“设计缺陷”。

如果您可能有一个不是 的特定子类,则Serializable唯一的缺点是如果尝试序列化,可能会出现运行时异常。如果您知道您的不可序列化子类永远不会被您的应用程序序列化,那么就没有真正的问题。

于 2012-06-20T18:36:13.510 回答
0

由于 Serializable 只是一个标记接口,我认为上述构造没有太多意义。在 Java 中,无法隐藏此接口,这意味着您将受到使用 Child 类的代码的支配。它可以处理序列化异常,也可以不处理。

它处理此类类的一个示例是,当您在 Java Web 容器会话中拥有一些类时,这些类会被持久化/恢复到磁盘/从磁盘中恢复。在这种情况下,Tomcat 和其他容器通常只给出警告而不退出。

于 2012-06-20T18:29:59.217 回答