Создание классов Child как Non Serializable в java

У меня есть класс, который реализует Serializable. Теперь я расширяю этот класс, и я хочу, чтобы этот расширенный класс не был Serializable. Итак, как это сделать?

Например. У меня

class A implements Serializable.

и я

class B extends A.

Но я хочу, чтобы класс B был Non Serializable.

Ответ 1

Как ясно из других, подкласс класса Serializable не может быть не Serializable.

Если вы хотите, чтобы атрибуты подкласса не были сериализованы, один из вариантов - сделать их все временными.

Если вам нужно больше (вы не хотите, чтобы поля суперкласса были сериализованы), переопределите writeObject(ObjectOutputStream) и readObject(ObjectInputStream), как описано здесь, https://web.archive.org/web/20120626144013/http://java.sun.com/developer/technicalArticles/ALT/serialization

Ответ 2

Вы не можете удалить интерфейс, но вы можете предотвратить сериализацию во время выполнения:

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

Ответ 3

Это действительно невозможно. Лучше всего сделать B композитным/украсить A.

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

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

Ответ 4

Он всегда будет Serializable, хотя вы можете гарантировать, что ничто в классе никогда не будет сериализовано, сделав каждый член transient.

Ответ 6

Отвечая на один из ваших комментариев (и предполагая, что вы говорите о JPA или Hibernate):

Но любой класс, который хочет, чтобы его объект сохранялся, должен реализовать это. и я хочу, чтобы объекты класса B не были устойчивыми.

Если вы не хотите, чтобы B был постоянным вообще, не отмечайте его как @Entity. Но для B не имеет смысла расширять A, если B не является постоянным объектом IMHO. Это было бы плохое использование наследования.

Ответ 7

Необходимо использовать методы readObject() и writeObject()