Quand devrions-nous implémenter l'interface sérialisable?

153
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' Serializableinterface?
  2. Pourquoi fait-on cela?
  3. Cela donne-t-il des avantages ou une sécurité?
theJava
la source
1
Pour votre information, la réponse acceptée ici est incomplète et trompeuse, car elle ne résout pas les inconvénients de sécurité. Voir Effective Java , article 86: implémenter Serializable avec une grande prudence. La réponse de Raedwald ici disant de ne pas utiliser la sérialisation est la bonne.
Nathan Hughes

Réponses:

157
  1. De De quoi parle ce truc de "sérialisation"? :

    Il vous permet de prendre un objet ou un groupe d'objets, de les placer sur un disque ou de les envoyer via un mécanisme de transport filaire ou sans fil, puis plus tard, peut-être sur un autre ordinateur, inverser le processus: ressusciter le ou les objets d'origine. Les mécanismes de base consistent à aplatir les objets en un flux unidimensionnel de bits et à transformer ce flux de bits en objets originaux.

    Comme le Transporter sur 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 (peut-être à un autre endroit, peut-être à un autre moment) et de reconstruire l'original compliqué " quelque chose."

    Alors, implémentez l' Serializableinterface 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 souhaitez stocker ou envoyer un objet.

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

moinudin
la source
4
Est-ce une bonne pratique d'implémenter une interface seriablizble à tous les modèles de domaine ...
theJava
8
@theJava Ce n'est pas une question de bonnes pratiques. Il s'agit de savoir si vous avez besoin ou non de séries d'octets.
moinudin
5
Lorsque vous utilisez JSON, vous n'avez pas à implémenter cette interface et vous pouvez simplement envoyer cette chaîne. Je ne sais donc toujours pas pourquoi utiliser cette interface lorsque vous pouvez utiliser JSON.
Yonatan Nir
1
@YonatanNir Je ne sais pas pourquoi on utiliserait JSON alors que MsgPack, Avro, Thrift ou Protobuf sont meilleurs pour le transfert IO.
OneCricketeer
1
@YonatanNir Un schéma strictement défini est préférable. Et JSON est censé être lisible par l'homme, tandis que les formats codés binaires sont beaucoup plus efficaces sur le fil
OneCricketeer
48
  1. Implémentez l' Serializableinterface lorsque vous souhaitez pouvoir convertir une instance d'une classe en une série d'octets ou lorsque vous pensez qu'un Serializableobjet peut référencer une instance de votre classe.

  2. Serializable Les classes sont utiles lorsque vous souhaitez conserver leurs instances ou les envoyer via un câble.

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

Steve Emmerson
la source
32

La réponse à cette question est, peut-être étonnamment, jamais , ou de manière plus réaliste, uniquement lorsque vous y êtes obligé pour l'interopérabilité avec le code hérité . Voici la recommandation de 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 déclaré publiquement que la suppression du mécanisme de sérialisation Java actuel était un objectif à long terme.


Pourquoi la sérialisation Java est imparfaite

Java fournit dans le cadre du langage un schéma de sérialisation auquel vous pouvez adhérer en utilisant l' Serializableinterface. Ce schéma présente cependant plusieurs défauts insolubles et doit être traité comme une expérience ratée par les concepteurs du langage Java.

  • Il prétend fondamentalement que l'on peut parler de la forme sérialisée d'un objet. Mais il existe une infinité de schémas de sérialisation, résultant en une infinité de formes sérialisées. En imposant un schéma, sans aucun moyen de changer le schéma, les applications ne peuvent pas utiliser un schéma qui leur convient le mieux.
  • Il est implémenté comme un moyen supplémentaire de construire des objets, ce qui contourne toutes les vérifications de précondition effectuées par vos constructeurs ou méthodes de fabrique. À moins que du code de désérialisation supplémentaire délicat, sujet aux erreurs et difficile à tester ne soit écrit, votre code présente probablement une faiblesse de sécurité béante.
  • Tester l'interopérabilité des différentes versions du formulaire sérialisé est très difficile.
  • 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é.

Raedwald
la source
2
pas vraiment un expert à ce niveau, mais je pense que vous avez raison.
nightfury
1
Je pense que c'est la meilleure réponse!
jjanczur