Почему мой класс исключений должен быть сериализован? - PullRequest
43 голосов
/ 07 октября 2011

Когда вы расширяете класс с помощью класса Exception (для создания нового исключения), вы получаете предупреждение, чтобы иметь serialVersionUID.Я знаю, что serialVersionUID играет важную роль при сериализации и десериализации, но когда мое исключение необходимо сериализовать?Кто-нибудь может дать мне практический пример, в котором я хочу, чтобы мой класс пользовательских исключений имел сериализацию и десериализацию?

Ответы [ 3 ]

53 голосов
/ 07 октября 2011

Это потому, что корневой класс для всех исключений Throwable реализует интерфейс Serializable.Все исключения по умолчанию являются сериализуемыми, и это решение для языка, потому что авторы хотели, чтобы исключения могли передаваться по проводам без какой-либо специальной конфигурации.

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

12 голосов
/ 07 октября 2011

Если ваше пользовательское исключение когда-либо используется в распределенном приложении (с использованием RMI, Spring http-invoker и т. Д.) И может быть вызвано из метода сервера, который вызывается из удаленного клиента, то исключение необходимо будет сериализовать в пересечь провод и перейти к клиенту.

4 голосов
/ 07 октября 2011

Ваши единственные варианты - либо определить serialVersionUID для каждого типа Exception, который вы определяете (IDE может сгенерировать его для вас), либо подавить предупреждение.

Вы можете найти мой предыдущий вопрос явный serialVersionUID сочтенным вредным? относящимся к делу.

...