Duplicata possible:
Pourquoi Java a besoin d'une interface sérialisable?
Selon la sérialisation dans Java docs:
La sérialisation d'une classe est activée par la classe implémentant l'interface Java.io.Serializable. Les classes qui n'implémentent pas cette interface n'auront aucun état sérialisé ou désérialisé. Tous les sous-types d'une classe sérialisable sont eux-mêmes sérialisables. L'interface de sérialisation n'a pas de méthodes ou de champs et ne sert qu'à identifier la sémantique d'être sérialisable
Pourquoi l'objet n'implémente-t-il pas déjà Serializable
? Les membres que nous ne voulons pas être sérialisables peuvent être créés en tant que transient
. Pourquoi empêcher la sérialisation par défaut?
Tous les sous-types d'une classe sérialisable sont eux-mêmes sérialisables.
En d'autres termes: toutes les classes que vous avez créées, ont été ou seront créées sont toutes sérialisables. transient
exclut uniquement les champs, pas les classes entières.
Il s'agit d'une faille de sécurité potentielle - par coïncidence, vous pouvez sérialiser, par exemple votre DataSource
avec les informations d'identification de la base de données à l'intérieur - si le créateur de cette implémentation DataSource
particulière a oublié de faire de tels champs transient
. Il est étonnamment facile de sérialiser un objet aléatoire Java, par exemple via des classes internes contenant une référence implicite à this
externe.
Il est juste plus sûr d'utiliser la liste blanche des classes que vous souhaitez explicitement et autorisez à sérialiser plutôt que d'examiner soigneusement votre code, en vous assurant qu'aucun champ que vous ne souhaitez pas n'est jamais sérialisé.
De plus, vous ne pouvez plus dire: MySuperSecretClass
n'est pas sérialisable (en n'implémentant simplement pas Serializable
) - vous ne pouvez exclure que les tripes (champs).
1.Serializable
est interface de marqueur, qui est vide, mais lorsqu'une classe est marquée Serializable, cela signifie que ses objets sont Serializable.
2. La raison pour laquelle Java.lang.Object n'a pas implémenté Serializable est parce que, si vous ne voulez PAS rendre certains champs comme sérialisables et que vous avez manqué mon erreur d'ajouter un transitoire à ce champ, alors ce sera un ravage.
. En faisant en sorte que le programmeur implémente Serializable pour sa classe, il fait prendre conscience au programmeur qu'il l'a consciemment implémenté, et devrait prendre les mesures nécessaires pour empêcher la sérialisation de tout ce qui ne devrait pas l'être.
La plupart des classes n'ont pas besoin d'être sérialisables. Avec la conception actuelle, vous pouvez facilement remarquer que la classe est sérialisable. Il s'agit essentiellement d'une auto-documentation vérifiée par le compilateur. Sinon, vous écririez probablement quelque chose comme:
/** DON'T SERIALIZE IT!!! */
class Connection { ... }
et il vaut mieux avoir une langue ou une bibliothèque que des commentaires.
Je pense qu'il est plus logique d'implémenter Serializable
pour les objets qui doivent être persistés et déclarer tous les champs de la classe transiennt
sera plus lourd. Un autre point pour lequel je ne suis pas sûr est que Object
est la racine de toutes les classes, qui inclut les classes liées à la réflexion, il sera donc inapproprié d'implémenter Serializable pour la classe Object.