Создание дочерних классов как не сериализуемых в Java - PullRequest
16 голосов
/ 09 февраля 2010

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

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

class A implements Serializable.

а у меня

class B extends A.

Но я хочу, чтобы класс B. не был сериализуемым.

Ответы [ 7 ]

15 голосов
/ 09 февраля 2010

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

class B extends A {
    private void writeObject(ObjectOutputStream oos) throws IOException {
        throw new NotSerializableException();
    }
}
13 голосов
/ 09 февраля 2010

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

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

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

4 голосов
/ 09 февраля 2010

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

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

    public void doSomething() {
        a.doSomething();
    }
}
4 голосов
/ 09 февраля 2010

Не возможно. Принцип замещения Лискова и все.

3 голосов
/ 09 февраля 2010

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

1 голос
/ 09 февраля 2010

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

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

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

0 голосов
/ 05 января 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...