Создание временного поля исключения в Java

#java #exception #serialization #transient

#java #исключение #сериализация #временный

Вопрос:

У меня есть класс, который расширяет Exception и, следовательно, должен быть сериализуемым. Класс exception содержит поле, которое не является сериализуемым, поэтому я рассматривал возможность сделать его временным. Я понимаю, что это будет означать, что поле не может быть восстановлено, если мой класс сохранен. Когда во время выполнения мои исключения могут быть сериализованы / десериализованы? (примечание: Насколько я знаю, я не записываю их в базу данных или файл).

Комментарии:

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

Ответ №1:

Если вы явно не сериализуете их самостоятельно, то я думаю, можно с уверенностью предположить, что переход вашего поля не будет иметь плохих последствий.

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

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

Ответ №2:

Если исключение распространяется через RMI, RPC-фреймворки или аналогичные, это может вызвать проблемы. Если вы не используете такие функциональные возможности, то вы можете сделать это временным.

Ответ №3:

Ваше понимание верно. Поля, помеченные как transient , не рассматриваются как часть состояния объекта и намеренно исключаются при сериализации объекта и не будут восстановлены при повторной десериализации объекта. Сериализация происходит, когда вы хотите сохранить объект и его состояние на диске или отправить объект по сети. Насколько я знаю, сериализация не происходит во время обычного выполнения программы, если вы явно не укажете своей программе сделать это..

Ответ №4:

Вы могли бы определить writeObject для вызова исключения UnsupportedOperationException или NotSerializableException, чтобы гарантировать, что этот объект никогда не будет сериализован.

Ответ №5:

Да, если у вас есть временные поля в вашем исключении, временные поля не могут быть восстановлены, если ваш объект сериализуется / десериализуется.

Однако в небольших приложениях маловероятно, что вам потребуется сериализация / десериализация, если вы не сериализуете исключения самостоятельно. Но обратите внимание, если вы используете какой-либо «волшебный» фреймворк, или JNDI, или любую кластеризованную среду.