Что такое хороший способ сделать класс неэриализуемым? - программирование
Подтвердить что ты не робот

Что такое хороший способ сделать класс неэриализуемым?

Java содержит много классов (например, в Swing), которые реализуют страшный и подверженный ошибкам интерфейс Serializable.

Если вы реализуете, скажем, новый TableModel, расширяя AbstractTableModel, новая модель должна быть сериализуемой, но что, если она содержит внутренние типы данных, которые не являются сериализуемыми и которые не должны быть, поскольку вы не Не планируете ли вы использовать эту функцию?

В таком случае инструменты вроде Sonar сходят с ума. Или жалуются, что "Class Foo определяет непереходное поле несериализуемого экземпляра bar".

Итак, я делаю это поле transient просто для того, чтобы получить "Поле Foo.bar является временным, но не задано десериализацией"

Можно ли сказать "Нет, этот класс не сериализуем, и я не хочу, чтобы он был таким", чтобы вы не получали никаких ошибок в таких инструментах, как Sonar?

4b9b3361

Ответ 1

Цитата из статья JavaRevisited (см. # 8):

Чтобы избежать сериализации Java, вам необходимо реализовать метод writeObject() и readObject() в своем классе и вам нужно выкинуть NotSerializableException из этого метода.

Поэтому вам просто нужно вставить это в свой класс:

private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {
    throw new java.io.NotSerializableException( getClass().getName() );
}

private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException {
    throw new java.io.NotSerializableException( getClass().getName() );
}

Ответ 3

Ответы, которые я вижу здесь, на самом деле просто отвечают, можно ли предотвратить сериализацию или десериализацию какого-либо класса, помеченного сериализуемым. Вопрос был другим, хотя:

"Можно ли сказать" Нет, этот класс не является сериализуемым, и я не хочу, чтобы он был таким ", чтобы у вас не было ошибок в таких инструментах, как Sonar?"

(Так что я задаюсь вопросом о тех многих голосах по этим ответам...)

Google вокруг ответа кажется "нет", сонару можно сказать, что такой класс является "ложным положительным", но требует вмешательства сонара. Разработчики, разрабатывающие код, проверенный другими людьми, не могут воспользоваться этой возможностью.

И поскольку вопрос на самом деле требует решения для других инструментов, таких как Sonar, тоже ответ вообще не может быть "Да" --- наверняка какой-то такой инструмент будет настаивать на "реализациях Serializable +" имеет несериализуемый непереходное поле "означает проблему.

Ответ 4

Вы можете использовать что-то подобное?

@SuppressFBWarnings(justification = "This field need to be transient")
private transient SomeObject myTransientField;

Вы подавите предупреждение Findbug. Вы также можете указать тип проверки, который вы хотите получить, например:

@SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED")

Полный список есть: http://findbugs.sourceforge.net/bugDescriptions.html

Ответ 5

Я могу подумать о реализации метода private void writeObject() следующим образом:

private void writeObject(ObjectOutputStream oos) throws IOException {
    throw new UnsupportedOperationException("Not serializable!!!");
}

В качестве альтернативы вы можете реализовать Externalizable и написать аналогичную реализацию writeExternal()

Оба не являются "хорошими" методами, но обходными способами.