10
votes

Sérialisable et transitoire

Pour faire une classe sérialisable, nous procédons comme suit: xxx

et non ceci: xxx

pourquoi, si nous voulons faire Une classe sérialisable, mettons-nous en place une interface spéciale . Et si nous voulons exclure certains champs, nous utilisons le mot-clé transitoire ? Pourquoi les mots-clés sont-ils utilisés dans les deux cas? Je veux dire existait des raisons de faire la même chose de différentes manières? Je sais, il n'y a pas de tel mot-clé que sérialisable mais pourquoi n'a-t-il pas été introduit à la place de l'interface spéciale sérialisable ?


6 commentaires

Hein? Je suis 100% confus ... et votre terminologie ne vous aide pas. Pour les démarreurs: Si vous souhaitez créer une classique Classe , vous disposez de la classe Mettre en œuvre l'interface sérialisable .


Cela voudrait Serialiser uniquement une valeur non?


Je ne comprends pas non plus la question, mais j'accepte totalement que la mise en œuvre de l'interface vide Serializable semble être magique (ce qui n'est pas identique à des numéros magiques, BTW).


Mais je pense que la question est de demander pourquoi sérialisable est greffé sur la langue. Et je pense que la réponse est parce que c'est.


@myers: Alors pourquoi est-il transitoire non? Si quelque chose, il a dû être introduit plus tard, car vous pouvez avoir le mécanisme de sérialisation sans membres transitoires, mais pas l'inverse.


@Michael Borgwardt: bonne question. Il a l'air de Java.sun.com/docs/books/ JLS / First_edition / HTML / 1.1UPDate.htm L Comme s'ils mettent le mot clé dans la première édition de la langue mais ne l'activez pas avant d'ajouter sérialisable dans 1.1.


5 Réponses :


4
votes

sérialisable est une interface de marqueur. Les interfaces sont une manière standard (en Java et dans d'autres langues) d'indiquer des caractéristiques d'une classe; une reliefe "est une" relief. Rendre Serializable Une interface signifie que nous pouvons déclarer des méthodes acceptant ou renvoyer sérialisable s comme nous pouvons les méthodes qui fonctionnent avec d'autres interfaces. Tout ce qui aurait besoin de changements de syntaxe nécessaires à la langue (à l'époque; nous avons maintenant des annotations, mais je pense qu'une interface serait toujours utilisée).


2 commentaires

J'espère que vous n'écrivez pas aux méthodes sérialisables comme paramètre ou types de retour.


Pourquoi pas? Pour une interface générale de stockage ou de communication, cela peut faire un sens parfait - votre besoin de choses pour être sérialisable, mais c'est tout.



0
votes

Vous demandez donc pourquoi vous ne pouvez pas marquer une classe comme non sérialisable (comme un membre transitoire)? Pourquoi ne feriez-vous pas de ne pas marquer les membres de la classe du type non-sérialisé comme transitoire? Ou utilisez une déléguée de sérialisation pour ce type de classe lorsque vous faites la sérialisation? Il semble un peu bizarre que vous voudriez dire à Java de pas faire quelque chose à ce niveau au lieu de le dire à faire quelque chose.


1 commentaires

Eh bien, en boo, vous dites au compilateur de ne pas le faire. Tout est sérialisable par défaut et il y a le mot-clé transitoire pour des trucs non sérialisables. Pas besoin de marqueurs.



28
votes

Pourquoi n'est pas utilisé de mot-clé spécial à marquer des cours aussi sérialisables aussi? Une interface sérialisable ressemble à un Nombres magiques en code et pas comme le fonctionnalité de langue.

Je pense que vous devez en regarder l'inverse: les mots-clés de la langue existent principalement pour prendre en charge les constructions de langue de la compilation. La sérialisation est un mécanisme d'exécution. De plus, vous ne voulez pas avoir de mot clé supplémentaire pour tout, car vous ne pouvez alors l'utiliser comme identifiant. Une interface de marqueur d'autre part est beaucoup moins intrusive.

La question est donc: pourquoi avons-nous besoin d'un mot-clé de langue pour marquer les champs transitoires? Et la réponse est qu'il n'y avait tout simplement pas d'autre moyen de marquer des champs spécifiques à cette époque.

De nos jours, on utiliserait des annotations à cet effet dans les deux cas (et pour d'autres choses comme le mot-clé StricFP STRICTFP ).


4 commentaires

Merci. Je conviens que le transitoire n'a été introduit que par des annotations absences. Mais je ne peux toujours pas comprendre pourquoi n'a pas été introduit par mot-clé "sérialisable".


Comme je l'ai dit: Ajout de mots-clés à une langue est en fait quelque chose que vous voulez éviter. Avec des classes, il pourrait être évité à l'aide d'une interface de marqueur à la place. Avec des champs, il n'y avait pas d'alternative.


J'ai un peu clarifié la question.


C'est la réponse à la question. Compte tenu de certaines fonctionnalités X que vous souhaitez ajouter, vous essayez d'éviter d'ajouter de nouveaux mots-clés à tout prix s'il existe déjà des constructions de langue pour le gérer. Ce n'est pas parce que vous devez faire des compromis sur une chose («transitoire» dans ce cas) ne signifie pas que vous transformez automatiquement tout le reste dans un mot-clé aussi.



1
votes

sérialisable est une interface de marqueur (comme clonable ) utilisé pour définir un drapeau pour le code de bibliothèque d'exécution Java standard qu'un objet peut être sérialisé en fonction du concepteur de cette classe.

Le mot clé transitoire peut être utilisé pour spécifier qu'un attribut n'a pas besoin d'être sérialisé, par exemple parce qu'il s'agit d'un attribut dérivé.

Voir aussi Cette réponse à une question similaire sur SO et Celui-ci sur la conception d'interfaces de marqueur .

mise à jour

Pourquoi les interfaces de marqueur et aucun mot-clé pour des choses comme Serializable, Clonable, etc.? Je suppose que la possibilité d'étendre systématiquement le Java Runtime Lib avec de nouvelles interfaces de marqueur combinées à trop de mots-clés si les aspects comportementaux le faisaient dans la langue.

Le fait que les attributs de classe ne peuvent pas implémenter des interfaces et transitoires peuvent être considérés comme une propriété générique d'un attribut permettent d'introduire transitoire comme mot-clé de langue.


0 commentaires

0
votes

Les mots-clés transitoires sont utilisés pour protéger une variable ou un champ d'être stocké et nous le faisons pour protéger certaines informations sensibles, nous ne voulons tout simplement pas distribuer à chaque endroit et que nous utilisons une interface sérialisable pour créer une classe sérialisable. Bien que nous puissions utiliser une interface externalisable également, mais nous préférons utiliser Serializable en raison de certains avantages.

Allez bien que cela comprenne clairement la sérialisation et le mot-clé transitoire. http: //www.codingeek. COM / Java / Io / Object-Streams-Serialization-désériorialisation-java-Exemple-Exemple-Serializable-interface /


0 commentaires