Превращение поля исключений в Java - PullRequest
4 голосов
/ 10 мая 2011

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

Ответы [ 5 ]

7 голосов
/ 10 мая 2011

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

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

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

4 голосов
/ 10 мая 2011

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

2 голосов
/ 10 мая 2011

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

1 голос
/ 10 мая 2011

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

0 голосов
/ 10 мая 2011

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

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

...