Как сделать класс, наследующий сериализуемый класс, не сериализуемым никогда? - PullRequest
1 голос
/ 13 августа 2011

Давайте рассмотрим следующий код:

public class MyPanel extends JPanel {

    private long secretInfo = ...

}

JPanel равно Serializable.Однако MyPanel не должно быть Serializable никогда, потому что оно содержит конфиденциальную информацию.

Как полностью отменить / предотвратить унаследованный Serializable аспект от JPanel?

Ответы [ 3 ]

4 голосов
/ 13 августа 2011

Вы помечаете поля, которые не хотите сериализовать, как transient:

private transient long secretInfo = ...  

Вы все еще можете сериализовать MyPanel, но его конфиденциальная информация не будет сериализована.

Кроме того, вы можете рассмотреть альтернативный дизайн, где конфиденциальная информация хранится в отдельном несериализуемом классе.

2 голосов
/ 13 августа 2011

Не расширяйте JPanel.Задача решена.Вместо этого попробуйте что-то вроде этого:

class MyPanel {
    void doSomething();
    String getSomeValue();
    JPanel getDisplayComponent();
}

MyPanel логически представляет панель в вашем приложении, но для расширения JPanel нет особых требований.Композиция часто является более сильным отношением.

2 голосов
/ 13 августа 2011

Вы можете использовать один из следующих подходов:

public class MyPanel extends JPanel {
    private long secretInfo = ...

    // refuse to be serialized!
    private void writeObject(ObjectOutputStream out) throws IOException {
        throw new IllegalStateException("MyPanel cannot be serialized");
    }
}

или

public class MyPanel extends JPanel {
    // flag the serialization mechanism to ignore
    // sensitive information
    private transient long secretInfo = ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...