在Java中将Child类设置为Non Serializable

时间:2010-02-09 12:43:47

标签: java inheritance oop serialization

我有一个实现Serializable的类。现在我扩展了这个类,我希望这个扩展类不是Serializable。那怎么办呢?

例如。我有

class A implements Serializable.

我有

class B extends A.

但我希望B类不可序列化。

7 个答案:

答案 0 :(得分:15)

您无法删除界面,但可以在运行时阻止序列化:

class B extends A {
    private void writeObject(ObjectOutputStream oos) throws IOException {
        throw new NotSerializableException();
    }
}

答案 1 :(得分:13)

正如其他人已经明确指出的那样,Serializable类的子类不可能是非Serializable

如果你想要的是子类的属性不被序列化,一个选择就是让它们都是瞬态的。

如果您需要更多(您不希望序列化超类字段),请按照此处所述覆盖writeObject(ObjectOutputStream)readObject(ObjectInputStream) - https://web.archive.org/web/20120626144013/http://java.sun.com/developer/technicalArticles/ALT/serialization

答案 2 :(得分:4)

这确实不可能。你最好的选择是让B复合/装饰A。

public class B {
    private A a = new A();

    public void doSomething() {
        a.doSomething();
    }
}

答案 3 :(得分:3)

不可能。 Liskov Substitution Principle和所有。

答案 4 :(得分:3)

它始终是Serializable,尽管您可以确保通过使每个成员transient序列化任何类中的任何内容。

答案 5 :(得分:1)

回答你的一条评论(假设你在谈论JPA或Hibernate):

  

但是任何希望其对象被持久化的类都应该实现它。我希望我的B级对象不可持久。

如果您不希望B持久存在,请不要将其标记为@Entity。但是如果B不是持久性实体恕我直言,那么B扩展A并没有多大意义。这将是对继承的错误使用。

答案 6 :(得分:0)

需要实现readObject()和writeObject()方法