如果父类是可序列化的,则在什么情况下您希望子类避免可序列化


 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。这似乎是一个糟糕的设计并且在某些方面令人困惑,所以我想知道您会考虑在什么情况下这样做?

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

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

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

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

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

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

相关内容

最新更新