Comment sérialiser des données membres statiques d'une classe Java?
Lorsque nous sérialiser des objets, des membres statiques ne sont pas numérotés, mais si nous avons besoin de le faire, est-il un moyen de sortir?
- Cesser d'utiliser les membres statiques pour les données qui doivent être sérialisé ?
- Addendum: arrêtez d'utiliser les membres statiques de tenir mutable état.
- +1, si vous sérialiser, n'utilisez pas de membres statiques
- Partagé et mutable ne sont PAS mutuellement exclusives. Il ne fait pas de sens pour sérialiser des constantes statiques (parce qu'ils sont unmutable), mais il parfois de sens pour sérialiser les variables statiques (parce qu'ils doivent être synchronisés avec le reste de l'état lors de la désérialisation).
- Vladimir, non, il ne fait pas de sens pour serialise champs statiques.
- Il ne fait jamais de sens de dire "jamais".
- C'est dans de telles situations que le modèle de conception Singleton est justifiée.
Vous devez vous connecter pour publier un commentaire.
La première question est pourquoi vous avez besoin de sérialiser les membres statiques?
Membres statiques sont associés à la classe, pas le cas, donc il n'est pas logique de les inclure lors de la sérialisation d'une instance.
La première solution est de faire de ces membres qui ne sont pas statiques. Ou, si ces membres sont les mêmes dans la classe d'origine et la classe cible (même classe, mais peut-être différents environnements d'exécution), ne pas sérialiser à tous.
J'ai quelques idées sur la façon dont on pourrait l'envoyer à travers les membres statiques, mais je dois d'abord voir le cas d'utilisation, comme dans tous les cas, cela signifie que la mise à jour de la classe cible, et je n'ai pas trouvé une bonne raison de le faire.
Gens, statique ne signifie pas IMMUABLE. Par exemple, je peux avoir envie de sérialiser l'état du calcul (oui, y compris les champs statiques -- compteurs, etc) afin de le reprendre plus tard, après la JVM et/ou de l'hôte de l'ordinateur redémarré.
Le droit de réponse à ça, comme déjà dit, est d'utiliser Externalizable, pas Sérialisable, interface. Ensuite, vous avez un contrôle complet sur ce que et comment vous extérioriser.
Vous pouvez contrôler la sérialisation par la mise en œuvre:
Il y a une description complète de la sérialisation http://java.sun.com/developer/technicalArticles/Programming/serialization/.
Comme d'autres réponses ont dit, il n'a pas vraiment de sens pour sérialiser statique comme c'est l'objet n'est pas la classe que vous soyez à la sérialisation et avoir besoin de faire des odeurs que vous avez d'autres problèmes avec votre code pour moi.
C'est la sérialisation pour le champ statique: newBookingNumber.
Bonnes réponses et les commentaires, ne pas le faire. Mais comment?
Les Chances sont que vous avez, le mieux serait de créer un objet pour contenir tous vos "Statique". Cet objet doit probablement avoir toutes les méthodes statiques à partir de votre classe ainsi.
Chaque instance de votre classe peut tenir cette autre classe, ou si vous avez vraiment pour vous pouvez en faire un singleton que tout membre peut accéder.
Après cela refactoriser, vous trouverez qu'il doit avoir été fait de cette façon tout au long. Vous pouvez même trouver que certains de vos anciens les contraintes de conception qui ont été de vous déranger à une subconsicionce niveau ont disparu.
Vous trouverez probablement que cette solution résout également les autres Sérialisation des problèmes que vous n'aviez même pas encore remarqué.
Vous pouvez le faire sans avoir à mettre à jour manuellement votre classe à chaque fois que vous changez simplement d'un champ.
Vous pouvez le faire si vous voulez avoir de la facilité de la statique des membres pour l'accès aux paramètres de l'application, mais tiens également à enregistrer ces paramètres.
Dans ce cas, vous aussi, vous voulez avoir la possibilité de les appliquer à sa guise, pas de charge par défaut que les autres solutions nécessitent, car ils sont statiques. Cela permet pour la restauration des paramètres pour des raisons évidentes.
Fondamentalement, utilisez le champ des méthodes pour obtenir tous les membres de la classe, puis la carte les noms et prénoms de ces champs pour le contenu. Le nom complet est nécessaire, car le Terrain n'est pas sérialisable lui-même. Sérialiser cette cartographie, et de le rétablir pour obtenir les paramètres enregistrés.
La deuxième pièce du puzzle est de l'appliquer() type de fonction. Cela passe par la cartographie, et applique ce qu'il peut pour la classe statique.
Vous devez également vous assurer que le contenu de la statique des membres sont eux-mêmes serializable.
Que peuvent espérer être vu à partir de cette classe d'exemple, les membres statiques peuvent facilement être enregistrés et restitués. Je vais laisser à l'opérateur de s'inquiéter à propos de Uides de classes, les garanties, etc. isSameAs() est utilisée pour les tests unitaires. AppSettings est la classe qui contient tous les champs statiques que vous le souhaitez à sérialiser.
}
Ceci est mon premier post - aller facile sur moi :P~
Statique membres appartiennent à la classe, et non à des objets individuels.
Vous devriez reconsidérer votre structure de données.
Avoir compacte mise en œuvre, de mettre en œuvre les méthodes readObject & writeObject dans votre classe appel defaultReadObject & defaultWriteObject méthodes à l'intérieur de ces méthodes qui gère à la normale de la sérialisation et ensuite procéder à la sérialisation & dé-sérialisation tout autre champs dont vous avez besoin.
Ce qui concerne,
GK
Oui, on peut sérialiser les variables statiques. Mais nous pouvons écrire notre propre
writeObject()
etreadObject()
. Je pense que cela peut résoudre le problème.