web-dev-qa-db-fra.com

Règles de sérialisation statique Java?

Je travaille sur une sérialisation de l'état de sauvegarde avec quelques méthodes et champs statiques. J'aurais pu jurer que cette sérialisation et cet effet statique causaient un chaos. Devrais-je faire tous les transitoires de statique? Et gonfler les appels restaurera-t-il la statique normalement?

32
ahodder

statics sont implicitement transient, vous n'avez donc pas besoin de les déclarer comme tels.

La sérialisation sert à la sérialisation instances , pas classes . Les champs static (les méthodes ne sont pas pertinentes car elles font partie de la définition de la classe et ne sont donc pas sérialisées) seront réinitialisées à la valeur définie lors du chargement de la classe. 

Si vous avez un champ mutable static, les modifications apportées à cette valeur seront perdues.

59
Robin

Les règles courtes peuvent être les suivantes:

1. Les variables static ne sont pas enregistrées lors de la sérialisation. Et au contraire, lors du processus de dé-sérialisation, les variables static sont lancées à partir de l'initialisation au niveau classe.

2. Les variables basées sur les mots clés static et transient sont ignorées pendant la sérialisation.

3. Le nom de classe et serialVersionUID sont tous deux sérialisés en tant que flux d'octets et, lorsqu'ils sont désérialisés, la serialVersionUID, lue à partir du source, est comparée à la classe locale de même variable static. C'est pourquoi serialVersionUID est déclaré en tant que static public final, de sorte qu'aucun objet supplémentaire ne doit être créé pour comparer ces versionUID (s).

  • Si, au cas où une différence était trouvée, une InvalidClassException Se produirait.
4
Gagandeep

Les champs static sont ignorés pour la sérialisation.

Mis à jour pour dire static plutôt que transient comme je l'avais initialement prévu ...

2
Brett Kail

Les champs static ne sont pas sérialisés.

1
ColinD

Les champs statiques ne peuvent jamais faire partie du fichier "ser". Statique + transitoire est identique à transitoire.

0
Jatin Shashoo

"Lorsque vous sérialisez une instance d'une classe, les seules choses sauvegardées sont les données d'instance non statiques et non transitoires. Les définitions de classe ne sont pas enregistrées. Elles doivent être disponibles lorsque vous essayez de désérialiser un objet" http: //Java.Sun.com/developer/technicalArticles/ALT/serialization/

0
Cris