У меня есть класс, который реализует сериализуемый. Теперь я расширяю этот класс, и я хочу, чтобы этот расширенный класс был не сериализуемым. Таким образом, как сделать это?
Например. Я имею
class A implements Serializable.
и я имею
class B extends A.
Но я хочу, чтобы класс B был Не сериализуемым.
As others have made clear, it's not possible for a subclass of a Serializable
class to be non-Serializable
.
If what you want is for the subclass' attributes not to be serialized, one option is to make them all transient.
If you need more than that (you don't want super class fields to be serialized), override writeObject(ObjectOutputStream)
and readObject(ObjectInputStream)
as outlined here - https://web.archive.org/web/20120626144013/http://java.sun.com/developer/technicalArticles/ALT/serialization
You can't remove the interface, but you can prevent serialization at run-time:
class B extends A {
private void writeObject(ObjectOutputStream oos) throws IOException {
throw new NotSerializableException();
}
}
Это действительно невозможно. Лучше всего, если вы позволите B композитно декорировать A.
public class B {
private A a = new A();
public void doSomething() {
a.doSomething();
}
}
Отвечая на один из ваших комментариев (и предполагая, что вы говорите о JPA или Hibernate):
Но любой класс, который хочет, чтобы его объект сохранялся, должен реализовать это. и я хочу, чтобы объекты моего класса B были нестабильными.
Если вы вообще не хотите, чтобы B был постоянным, не помечайте его как @Entity
. Но для B не имеет смысла расширять A, если B не является постоянным объектом IMHO. Это было бы плохим использованием наследования.
Он всегда будет сериализуемым, хотя вы можете гарантировать, что ничто в классе никогда не будет сериализовано, сделав каждый член переходным
.