web-dev-qa-db-fra.com

Pourquoi ma classe d'exception doit être sérialisée?

Lorsque vous étendez une classe avec la classe Exception (pour créer une nouvelle exception), vous obtenez un avertissement pour avoir un serialVersionUID. Je sais que serialVersionUID joue un rôle important lors de la sérialisation et de la désérialisation, mais quand mon exception doit être sérialisée? Quelqu'un peut-il me donner un cas pratique dans lequel je veux que ma classe d'exception personnalisée ait la sérialisation et la désérialisation?

44
amod

En effet, la classe racine de toutes les exceptions, Throwable implémente l'interface Serializable. Toutes les exceptions par défaut sont sérialisables et c'est une décision de conception de langage parce que les auteurs voulaient que les exceptions puissent être envoyées sur le fil sans aucune configuration spéciale.

Si la classe de base n'est pas sérialisable, vous aurez du mal à transmettre ce qui s'est exactement passé en cas d'échec d'une méthode distante, car vous n'auriez aucun contrôle sur les types d'exceptions intégrés.

56
Sanjay T. Sharma

Si votre exception personnalisée est déjà utilisée dans une application distribuée (à l'aide de RMI, Spring http-invoker, peu importe) et peut être levée à partir d'une méthode serveur qui est invoquée à partir d'un client distant, alors l'exception devra être sérialisée pour traverser le fil et allez chez le client.

12
JB Nizet

Vos seules options sont de définir serialVersionUID pour chaque Exception type que vous définissez (le IDE peut le générer pour vous) ou de supprimer l'avertissement.

Vous pouvez trouver ma question précédente serialVersionUID explicite considéré comme dangereux? pertinent.

5