web-dev-qa-db-fra.com

Pourquoi Java.lang.Object n'implémente-t-il pas l'interface sérialisable?

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?

36
TJ-

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).

44
Tomasz Nurkiewicz

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.

14
Kumar Vivek Mitra

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.

5
vbezhenar

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.

1
gmuhammad