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

时间:2012-06-20 18:20:13

标签: java serialization deserialization

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

3 个答案:

答案 0 :(得分:3)

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

由于无法删除祖先类中实现的接口,因此您无法做出选择:提出异常总是更好,然后序列化一些不打算序列化的东西,这会让你觉得一切都很顺利序列化数据会出错。禁止序列化总是有理由:只在子类中添加一个不可序列化的字段就足够了(除非你可以将它用作transient但是如果字段包含关键信息,这并不总是可行的)。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

由于Serializable只是tagging interface,我在上面的构造中看不到太多意义。在Java中,无法隐藏此接口,这意味着您将受到使用Child类的代码的支配。它可能会处理序列化异常,也可能不会。

处理此类时的一个示例是,您在Java Web容器会话中获得了一些类,这些类会被持久化并从磁盘中恢复。在这种情况下,Tomcat和其他容器通常只发出警告但不退出。