36 votes

Pénalité pour implémenter Serializable en Java ?

Y a-t-il une pénalité pour ajouter

implements Serializable

à une classe Java ? Impact sur la taille de l'objet instancié ou sur les performances ?

25voto

mikera Points 63056

Le coût est proche de zéro, il ne vaut pas la peine de s'en préoccuper.

Quelques détails supplémentaires :

  • Il n'y a pas d'augmentation de la taille de chaque instance d'objet.
  • Il y a une légère augmentation de la taille de la classe elle-même, mais comme il s'agit d'un coût unique, il est insignifiant lorsqu'il est amorti sur un grand nombre d'instances.
  • Il peut y avoir un léger coût d'exécution supplémentaire pour tout ce qui doit effectuer des vérifications d'interface à l'exécution (réflexion, recherche d'instanciation, pression supplémentaire sur les caches en ligne, etc.) ). Encore une fois, il est probable que ce coût soit négligeable dans la plupart des cas.
  • Serializable est un interface de marquage il n'y a pas de méthode à mettre en œuvre. D'autres exemples d'interfaces de marqueurs sont : Clonable, SingleThreadModel, Event listener.

25voto

ManojGumber Points 1615

Il n'y a pas d'impact sur les performances, sauf si vous effectuez une sérialisation/désérialisation, mais il y a des compromis à faire en termes de conception d'API.

De Java efficace par Joshua Bloch

  • L'un des principaux inconvénients de la mise en œuvre de Serializable est qu'elle réduit la possibilité de modifier l'implémentation d'une classe une fois qu'elle a été publiée
  • Un deuxième coût de l'implémentation de Serializable est qu'il augmente la probabilité de bogues et de failles de sécurité.
  • Un troisième coût de l'implémentation de Serializable est qu'il augmente la charge de test associée à la publication d'une nouvelle version d'une classe.

La mesure dans laquelle ils s'appliquent à vous dépend de votre cas d'utilisation.

24voto

adarshr Points 25912

À moins que vous / quelqu'un d'autre ne sérialise / désérialise réellement, il n'y aura pas d'impact. Serializable est juste une interface de marquage.

Cela n'augmentera probablement la taille du bytecode généré que de quelques octets.

2voto

Peter Lawrey Points 229686

Vous devez toujours considérer en premier lieu les frais d'entretien. Le coût d'une application déployée pendant sa durée de vie peut représenter plusieurs fois le coût de son développement.

Dans ce cas, le coût de rendre une classe sérialisable, mais qui n'est pas réellement utilisée pour la sérialisation pourrait causer des bogues ou une confusion bien plus grande que le coût de la performance. Par exemple, si cela prend une minute ou le temps de quelqu'un pour déterminer que le sérialisable n'est pas nécessaire, cela peut coûter bien plus que les quelques nano-secondes de temps de démarrage supplémentaire que l'application subit.

Si vous avez réellement besoin qu'il soit sérialisable, vous ne pouvez pas le comparer à la version non sérialisable car seul le premier cas fera réellement le travail demandé.

0voto

Daniel Dinnyes Points 1273

Serializable est juste une interface "marqueur". Elle ne vous oblige pas à mettre en œuvre des méthodes.

La seule chose est qu'il est recommandé d'avoir un static final long serialVersionUID pour aider l'API de sérialisation. Cela coûte un seul long par classe sérialisée.

Vous pourriez vouloir vérifier cet article sur l'API de sérialisation Java . Il décrit en détail la plupart des problèmes de sérialisation/désérialisation.

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