我有一个实现Serializable的类。现在我扩展了这个类,我希望这个扩展类不是Serializable。那怎么办呢?
例如。我有
class A implements Serializable.
我有
class B extends A.
但我希望B类不可序列化。
答案 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()方法