web-dev-qa-db-fra.com

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

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 devrais-je implémenter l'interface Serializable?
  2. Pourquoi fait-on cela?
  3. Donne-t-il des avantages ou une sécurité?
141
theJava
  1. De Qu'est-ce que cette "sérialisation"? :

    Il vous permet de prendre un objet ou un groupe d’objets, de les placer sur un disque ou de les envoyer par un mécanisme de transport filaire ou sans fil, puis inverser le processus ultérieurement, peut-être sur un autre ordinateur: revenez à l’objet ou aux objets d’origine. Les mécanismes de base consistent à aplatir un ou plusieurs objets en un flux de bits unidimensionnel et à reconvertir ce flux en un ou plusieurs objets originaux.

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

    Donc, implémentez l'interface Serializable lorsque vous avez besoin de stocker une copie de l'objet, envoyez-les à un autre processus qui s'exécute sur le même système ou sur le réseau.

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

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

144
marcog
  1. Implémentez l'interface Serializable lorsque vous souhaitez pouvoir convertir une instance d'une classe en une série d'octets ou lorsque vous pensez qu'un objet Serializable pourrait référencer une instance de votre classe.

  2. Les classes Serializable sont utiles lorsque vous souhaitez en conserver des instances ou les envoyer par un fil.

  3. Les instances de Serializable classes peuvent être facilement transmises. La sérialisation a cependant des conséquences sur la sécurité. Lisez Joshua Bloch's Effective Java.

43
Steve Emmerson

La réponse à cette question est peut-être étonnamment jamais , ou plus réaliste, uniquement lorsque vous êtes obligé de interopérabilité avec le code hérité . Voici la recommandation de Effective Java, 3ème édition par Joshua Bloch:

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

L’architecte en chef d’Oracle, Mark Reinhold, est en cours d’enregistrement selon lequel la suppression du mécanisme de sérialisation actuel Java est un objectif à long terme.


Pourquoi Java la sérialisation est défectueuse)

Java fournit dans le langage un schéma de sérialisation auquel vous pouvez vous connecter, en utilisant l'interface Serializable. Ce schéma présente toutefois plusieurs failles intraitables et doit être traité comme une expérience manquée par les concepteurs de la langue Java.

  • Il prétend fondamentalement que l'on peut parler de la forme sérialisée d'un objet le. Mais il existe une infinité de schémas de sérialisation, qui aboutissent à un nombre infini 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 est mis en œuvre en tant que moyen supplémentaire de construction d'objets, qui contourne toute vérification préalable effectuée par vos constructeurs ou méthodes d'usine. À moins d'écrire un code de désérialisation supplémentaire délicat, sujet aux erreurs et difficile à tester, votre code a probablement une faille de sécurité béante.
  • Il est très difficile de tester l'interopérabilité de différentes versions du formulaire sérialisé.
  • La manipulation d'objets immuables est gênante.

Que faire à la place

Utilisez plutôt un schéma de sérialisation que vous pouvez contrôler explicitement. Tels que les tampons de protocole, JSON, XML ou votre propre schéma personnalisé.

12
Raedwald