2011-10-12 46 views
6

cuando creo Clase Java en Eclipse que implementa Serializable interfaz, recibo una advertencia¿Cómo se calcula serialVersionUID

El ABCD clase serializable no significa declarar una campo serialVersionUID static final de tipo long

Entonces, cuando hago clic en advertencia, aparece la opción en Eclipse en

Agregue la versión de serie generada ID

Una vez que elijo esa opción, Eclipse crea automáticamente una variable serialVersionUID para mí.

Ahora quería saber en qué se basa ese número. ¿Es un número aleatorio? ¿Puedo proporcionar mi propio número al azar?

Respuesta

12

Se calcula en base a la estructura de su clase: campos, métodos, etc. Se especifica en el Object Serialization Specification - see this section para el formato exacto.

La especificación describe lo que sucede en ningún valor, pero la autogeneración usa el mismo algoritmo.

La secuencia de elementos de la corriente es como sigue:

  • El nombre de la clase.
  • Los modificadores de clase escritos como un entero de 32 bits.
  • El nombre de cada interfaz ordenado por nombre.
  • Para cada campo de la clase ordenado por nombre de campo (excepto campos privados transitorios estáticos y privados: * El nombre del campo. * Los modificadores del campo escritos como un entero de 32 bits. * El descriptor del campo
  • Si existe un inicializador de clase, escriba lo siguiente: * El nombre del método,. * El modificador del método, java.lang.reflect.Modifier.STATIC, escrito como un entero de 32 bits. * El descriptor del método,() V.
  • Para cada constructor no privado ordenado por nombre de método y firma: * El nombre del método,. * Los modificadores del método escrito como un entero de 32 bits . * El descriptor del método.
  • Para cada método no privado ordenado por nombre de método y firma: * El nombre del método. * Los modificadores del método escritos como entero de 32 bits. * El descriptor del método.
4

serialVersionIds generadas automáticamente son un hash basado en las firmas de los métodos, parámetros y similares en la clase. Se hace de esta manera para que el serialVersionId cambie cada vez que cambie su clase, indicando al mecanismo de serialización que allí los datos/clase ya no son compatibles. Ese es el predeterminado.

Cuando defina el suyo, simplemente comience con 1, e incremente cuando la clase ya no sea compatible con datos previamente serializados.

Cuestiones relacionadas