2016-12-28 3 views
-1

pendant que je cherchais beaucoup mais incapable de trouver une réponse raisonnable pour le même. Pourquoi serialversionuid ne peut-il pas être double? Une raison spécifique de garder serialversionuid longtemps?Pourquoi Serialversion est-il long en Java?

+3

Pourquoi serait-il utile d'avoir un identifiant de type double? – Hulk

+0

Parce que le javadoc de Serializable le dit? – assylias

+0

Parce qu'un 'long' a plus de bits de précision. Parce que 'long' est exact. Parce que la partie fractionnaire d'un «double» n'est pas nécessaire. Parce qu'il n'y a pas de respect dans lequel un «double» serait supérieur. Parce que les deux [Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html) et [Object Serialization Specification] (https://docs.oracle.com /javase/8/docs/platform/serialization/spec/class.html) dites-le. – EJP

Répondre

3

Un identifiant unique est généralement un nombre entier choisi au hasard. par exemple. UUID est deux valeurs longues.

L'utilisation d'un double est beaucoup plus difficile car toutes les valeurs 64 bits ne sont pas utilisées en Java et certaines valeurs ne sont pas égales à elles-mêmes. Double.NaN.

BTW si vous voulez vraiment utiliser un double vous pouvez le faire

private static final long serialVersionUID = Double.doubleToRawLongBits(1.28); 

Mais je ne sais pas quelle valeur en utilisant une valeur en virgule flottante aurait. Si vous souhaitez encoder un numéro de version que vous pouvez le faire

private static final long serialVersionUID = MAJOR * 1000 + MINOR; 
0

Un UID est quelque chose qui doit être unique dans un contexte donné pour la sérialisation, puisqu'il généralement calculé par IDEs ou le programmeur lors de la création d'une instance de Serializable . Pour quelque chose qui devrait être unique, le type de données long semble raisonnable. Raisonnable parce que, c'est un type de données implicite et est le plus grand disponible à côté de double. Plus le type de données est grand, plus le risque de conflit lors de la génération de l'ID unique est faible. (Imaginez que vous utilisiez byte comme type de données pour serialVersionUID Vous auriez seulement 256 valeurs disponibles pour générer des ID "uniques", ce qui entraînerait beaucoup de conflits. Le type de données double a ses propres problèmes de comparaison avec d'autres valeurs double. long n'a pas de tels problèmes. D'un autre côté, l'utilisation d'un String ou d'autres types de référence peut ne pas convenir car cela peut être coûteux en termes de complexité spatiale et temporelle. Toutes ces raisons font de long un choix raisonnable pour l'utiliser comme type de données pour serialVersionUID. Pour plus d'informations, référez-vous à this article pour plus d'informations. J'ai aussi extrait quelques bits de la même chose.

Les associés d'exécution de sérialisation avec chaque classe sérialisable un numéro de version, appelée serialVersionUID, qui est utilisé lors de la désérialisation pour vérifier que l'expéditeur et le destinataire d'un objet sérialisé ont les classes chargées pour cet objet qui sont compatibles avec le respect de sérialisation. Si le récepteur a chargé une classe pour l'objet qui a un serialVersionUID différent de celui de la classe de l'expéditeur correspondant, alors la désérialisation aboutira à une exception InvalidClassException. Une classe sérialisable peut déclarer sa propre serialVersionUID explicitement en déclarant un champ nommé « serialVersionUID » qui doit être statique, finale et de type long:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 

Si une classe sérialisable ne déclare pas explicitement serialVersionUID , puis le runtime de sérialisation calcule une valeur serialVersionUID par défaut pour cette classe en fonction de divers aspects de la classe, comme décrit dans la spécification de sérialisation d'objet Java (TM). Toutefois, il est fortement recommandé que toutes les classes sérialisables déclarent explicitement les valeurs serialVersionUID, car le calcul serialVersionUID par défaut est très sensible aux détails de classe qui peuvent varier en fonction des implémentations du compilateur, et peut donc entraîner des InvalidClassExceptions inattendues lors de la désérialisation. Par conséquent, pour garantir une valeur serialVersionUID cohérente entre les différentes implémentations de compilateur java, une classe sérialisable doit déclarer une valeur explicit serialVersionUID.Il est également fortement conseillé que les déclarations explicitement serialVersionUID utilisent le modificateur private si possible, puisque ces déclarations ne s'appliquent qu'à la classe déclarant immédiatement - les champs serialVersionUID ne sont pas utiles en tant que membres hérités. Les classes Array ne peuvent pas déclarer un serialVersionUID explicite, elles ont donc toujours la valeur calculée par défaut, mais l'exigence de correspondance des valeurs serialVersionUID est supprimée pour les classes de tableau.

Espérons que cela aide!