174 votes

Quand devons-nous implémenter l'interface Serializable ?

package 

public class Contact implements Serializable  {

 private String name;
 private String email;

 public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
     return email;
    }

    public void setEmail(String email){
     this.email = email;
    }

}
  1. Quand dois-je implémenter l'interface Serializble en série ?
  2. Pourquoi faisons-nous cela ?
  3. Offre-t-il des avantages ou une sécurité ?

4 votes

Pour information, la réponse acceptée ici est incomplète et trompeuse, car elle n'aborde pas les inconvénients de la sécurité. Voir Java efficace , Point 86 : Implémentez Serializable avec une grande prudence. La réponse de Raedwald ici disant de ne pas utiliser la sérialisation est la bonne.

168voto

marcog Points 39356
  1. De C'est quoi cette histoire de "sérialisation" ? :

    Il vous permet de prendre un objet ou un groupe d'objets d'objets, de les mettre sur un disque ou de les envoyer ou de les envoyer par un mécanisme de filaire ou sans fil, puis plus tard, peut-être sur un autre ordinateur, inverser le processus : ressusciter le ou les objet(s) original(aux). Les mécanismes de base sont les suivants aplatir l'objet ou les objets en un un flux unidimensionnel de bits, et à transformer ce flux de bits en objet(s) d'origine.

    Comme le téléporteur dans Star Trek, il s'agit de prendre quelque chose compliqué et de le transformer en une séquence plate une séquence plate de 1 et 0, puis de prendre cette séquence de 1s et 0s (éventuellement à un autre endroit, éventuellement à un autre moment) et de reconstruire l'original compliqué original.

    Donc, mettez en œuvre le Serializable lorsque vous devez stocker une copie de l'objet, l'envoyer à un autre processus sur le même système ou sur le réseau.

  2. Parce que vous voulez stocker ou envoyer un objet.

  3. Il facilite le stockage et l'envoi d'objets. Il n'a rien à voir avec la sécurité.

5 votes

Est-ce une bonne pratique d'implémenter une interface sérieuse pour tous les modèles de domaine...

9 votes

@theJava Ce n'est pas une question de meilleures pratiques. Il s'agit de savoir si vous avez besoin ou non de séries d'octets.

6 votes

Lorsque vous utilisez JSON, vous n'avez pas besoin d'implémenter cette interface et vous pouvez simplement envoyer cette chaîne de caractères donc je ne sais toujours pas pourquoi utiliser cette interface lorsque vous pouvez utiliser JSON.

59voto

Raedwald Points 8862

La réponse à cette question est, peut-être surprenante, jamais ou de manière plus réaliste, uniquement lorsque vous y êtes contraint pour l'interopérabilité avec le code existant. . C'est la recommandation faite dans Effective Java, 3e édition par Joshua Bloch :

Il n'y a aucune raison d'utiliser la sérialisation Java dans tout nouveau système que vous écrivez.

L'architecte en chef d'Oracle, Mark Reinhold, a fait savoir comme disant que supprimer le mécanisme actuel de sérialisation de Java est un objectif à long terme.


Pourquoi la sérialisation Java est défectueuse

Java fournit, en tant que partie intégrante du langage, un schéma de sérialisation auquel vous pouvez adhérer, en utilisant la fonction Serializable interface. Ce schéma présente toutefois plusieurs défauts insolubles et devrait être considéré comme une expérience ratée par les concepteurs du langage Java.

  • Il prétend fondamentalement que l'on peut parler de le site forme sérialisée d'un objet. Mais il existe une infinité de schémas de sérialisation, qui donnent lieu à une infinité de formes sérialisées. En imposant un schéma, sans aucun moyen de le modifier, les applications ne peuvent pas utiliser le schéma qui leur convient le mieux.
  • Il s'agit d'un moyen supplémentaire de construire des objets, qui contourne les contrôles de précondition effectués par vos constructeurs ou méthodes de fabrique. À moins que vous n'écriviez un code de désérialisation supplémentaire délicat, sujet aux erreurs et difficile à tester, votre code présente probablement une faiblesse de sécurité flagrante.
  • Il est très difficile de tester l'interopérabilité de différentes versions du formulaire sérialisé.
  • La manipulation d'objets immuables est problématique.

Ce qu'il faut faire à la place

Au lieu de cela, utilisez un schéma de sérialisation que vous pouvez contrôler explicitement. Par exemple, Protocol Buffers, JSON, XML ou votre propre schéma personnalisé.

49voto

Steve Emmerson Points 4161
  1. Mettre en œuvre la Serializable lorsque vous souhaitez être en mesure de convertir une instance d'une classe en une série d'octets ou lorsque vous pensez qu'une Serializable peut faire référence à une instance de votre classe.

  2. Serializable sont utiles lorsque vous voulez faire persister des instances de ces classes ou les envoyer sur un fil.

  3. Instances de Serializable les classes peuvent être facilement transmises. La sérialisation a cependant quelques conséquences sur la sécurité. Lisez "Effective Java" de Joshua Bloch.

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