66 votes

Utiliser le serialVersionUID ou supprimer les avertissements?

Je veux créer une classe qui, par exemple, étend HttpServlet? Mon compilateur me prévient que ma classe devrait avoir un serialVersionUID. Si je sais que cet objet ne sera jamais sérialisé, dois-je le définir ou ajouter une annotation pour supprimer ces avertissements?

Que feriez-vous et pourquoi?

27voto

Steve Jessop Points 166970

Je ne sais pas Java meilleures pratiques, mais il me semble que si vous alléguez que la sérialisation n'arrivera jamais, vous pourriez ajouter une méthode writeObject qui en jette. Puis supprimer l'avertissement, en sachant qu'il ne peut pas s'appliquer à vous.

Sinon, quelqu'un pourrait à l'avenir sérialiser votre objet dans la classe parente, et finissent par défaut avec une forme sérialisée où:

  • la forme n'est pas compatible entre les différentes versions de votre code.
  • vous avez supprimé l'avertissement que c'est le cas.

L'ajout d'un ID sonne comme un bodge, puisque ce que vous voulez vraiment, c'est pas sérialiser. Attend les appelants ne pas sérialiser l'objet de votre signifie que vous vous attendez à eux de "savoir" lors de leurs HttpServlet est de votre classe. Que la violation de polymorphisme est sur votre tête pour avoir un objet Sérialisable qui ne doit pas être sérialisé, et le moins que l'on puisse faire est de vous assurer imprudents appelants savoir sur le sujet.

18voto

Bno Points 5688

Si vous ne prévoyez pas de sérialiser les cas, ajouter un SuppressWarning.

Une série générée ID peut être un peu dangereux. Il suggère que vous avez intentionnellement donné un numéro de série et que c'est enregistrer pour sérialiser et désérialiser. Il est facile d'oublier de mettre à jour le numéro de série dans une nouvelle version de votre application si votre classe est modifiée. La désérialisation d'échouer si la classe de champs ont été modifiés. Avoir un SuppressWarning au moins dit le lecteur de votre code que vous n'avez pas l'intention de sérialiser cette classe.

14voto

ykaganovich Points 8497

Je refuse d'être terrorisé par Eclipse en ajoutant du fouillis à mon code!

Je viens de configurer Eclipse pour ne pas générer d'avertissements sur l'absence de serialVersionUID.

10voto

Mike Points 61

Merci @ Steve Jessop pour sa réponse à ce sujet. C'était 5 lignes de code ... à peine un problème.

J'ai ajouté @SuppressWarnings ("serial") juste au-dessus de la classe en question.

J'ai aussi ajouté cette méthode: private void writeObject (ObjectOutputStream oos) lève l'IOException {lève un nouvel IOException ("Cette classe n'est PAS sérialisable."); }

J'espère que c'est ce que Steve voulait dire :)

6voto

serg Points 43893

Même si vous savez que cet objet sera sérialisé, il n'est pas nécessaire de générer serialVersionUID car java le générera automatiquement pour vous et gardera automatiquement la trace des modifications, de sorte que votre sérialisation fonctionnera toujours correctement. Vous ne devez le générer que si vous savez ce que vous faites (compatibilité de la sérialisation en amont, suivi manuel des modifications, etc.).

Je dirais donc que supprimer l'avertissement est la solution la plus sûre et la plus sûre dans la plupart des cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X