JavaRush /Blog Java /Random-ES /¿Por qué utilizar SerialVersionUID dentro de la clase Ser...
0xFF
Nivel 9
Донецк

¿Por qué utilizar SerialVersionUID dentro de la clase Serializable en Java?

Publicado en el grupo Random-ES
Serializationy SerialVersionUIDsiempre sigue siendo un misterio para muchos desarrolladores de Java. A menudo veo preguntas sobre qué es SerialVersionUIDo qué sucede si no declaro SerialVersionUIDen mi Serializableclase. ¿Por qué utilizar SerialVersionUID dentro de la clase Serializable en Java - 1Además de ser confuso y de uso poco frecuente, otra razón para esta pregunta es la advertencia que falta en el IDE de Eclipse SerialVersionUID, por ejemplo: " La clase Serializable Cliente no declara un campo SerialVersionUID final estáticoSerializable de Customertipo SerialVersionUIDlargo " En este artículo, no sólo aprenderá los conceptos básicos de Java SerialVersionUIDsino también su impacto en el proceso de serialización y deserialización. Cuando declara una clase, como Serializableal implementar una interfaz token java.io.Serializable, el tiempo de ejecución de Java almacena una instancia de esa clase en el disco usando el mecanismo de serialización predeterminado a menos que configure el proceso para usar la interfaz externalizable . Durante la serialización, el tiempo de ejecución de Java crea un número de versión para la clase para poder deserializarla más tarde. En Java, este número de versión se conoce como SerialVersionUID. Si, durante la deserialización, SerialVersionUIDno hay ninguna coincidencia, entonces el proceso saldrá con una excepción InvalidClassExceptionen la " main" secuencia java.io.InvalidClassExceptiony también imprimirá el nombre de la clase y el correspondiente SerialVersionUID. Una solución rápida para solucionar este problema es copiarlo SerialVersionUIDy definirlo como un tipo constante private static final longen su clase. En este artículo, aprenderemos por qué deberíamos usarlo SerialVersionUIDen Java y cómo usar la herramienta serialver JDK para generar esta ID. Si es nuevo en la serialización, también puede ver las 10 preguntas principales de la entrevista sobre serialización de Java para evaluar sus conocimientos y encontrar lagunas en su comprensión para seguir leyendo. Al igual que Concurrency(concurrencia) y Multi-threading(multiproceso), Serialization(serialización) es otro tema que merece ser leído varias veces.

¿Por qué utilizar SerialVersionUID en Java?

Como dije, cuando no hayamos definido un valor SerialVersionUIDcomo static final longen nuestra clase, el mecanismo de serialización lo hará por nosotros. Este mecanismo es sensible a muchos detalles, incluidos los campos de su clase, sus modificadores de acceso, las interfaces que implementa e incluso diferentes implementaciones del compilador; cualquier cambio en la clase o el uso de un compilador diferente puede producir un resultado diferente, SerialVersionUIDque en última instancia detener la recarga de datos serializados. Es arriesgado confiar en el mecanismo de serialización de Java para generar esta identificación, por lo que es una buena idea definirla explícitamente SerialVersionUIDen su clase Serializable . Recomiendo encarecidamente leer el clásico de Java: Joshua Bloch "Java efectivo" para comprender la serialización de Java y los problemas de manejarlos incorrectamente. Por cierto, el JDK también proporciona una herramienta serialver, ubicada en el directorio bin del directorio JAVA_HOME , en mi computadora, C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , que puede usarse para generar SerialVersionUIDpara clases antiguas. Esto es muy útil en caso de que haya realizado cambios en su clase que interrumpan la serialización y su aplicación no pueda recargar instancias serializadas. Puede usar fácilmente esta utilidad para crear SerialVersionUIDinstancias antiguas y luego usarla explícitamente declarando el campo como privado estático final largo SerialVersionUID . Por cierto, es muy recomendable por motivos de rendimiento y seguridad utilizar el formato binario normal para la serialización; nuevamente, “Java efectivo” tiene varios párrafos que demuestran las ventajas del formato normal con gran detalle.

Cómo utilizar la utilidad serialver JDK para generar SerialVersionUID

Puedes usarlo serialverpara generar SerialVersionUIDclases. Esto es especialmente útil para desarrollar clases; la utilidad regresa SerialVersionUIDen un formato fácil de copiar. Puede utilizar la serialverutilidad JDK como se muestra en el ejemplo:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
También puede utilizar la utilidad serialvercomo GUIcomando $ serialver –show; esto abrirá un inspector serial versionque toma el nombre completo de la clase y lo muestra Serial version.

Resumen

Ahora que sabemos qué es SerialVersionUIDy por qué es importante declararlo en una Serializableclase, es hora de revisar algunos datos importantes relacionados con Java SerialVersionUID.
  1. SerialVersionUIDSe utiliza para indicar la versión de los datos serializados.

  2. Cuando no declaramos SerialVersionUIDen nuestra clase, el tiempo de ejecución de Java lo hace por nosotros, pero este proceso es sensible a muchos metadatos de la clase, incluido el número de campos, el tipo de campos, los modificadores de acceso a los campos, las interfaces que se implementan en la clase. , etc. Puede encontrar la información exacta en la documentación de serialización de Oracle.

  3. Se recomienda declarar SerialVersionUID como una variable larga final estática privada para evitar el mecanismo predeterminado. Algunos IDE, como Eclipse , también emiten advertencias si olvida esto, por ejemplo: "La clase Serializable Customer no declara un campo SerialVersionUID final estático de tipo largo". Aunque puede desactivar esta advertencia yendo a Ventana > Preferencias > Java > Compilador > Errores/Advertencias > Posibles problemas de programación, le sugiero no hacerlo. Sólo cuando no se requiere recuperación de datos puedo ser descuidado. Así es como se ve este error en Eclipse IDE, todo lo que necesita hacer es tomar la primera decisión rápida. ¿Por qué utilizar SerialVersionUID dentro de la clase Serializable en Java - 2

  4. También puede utilizar la utilidad serialver del JDK para generar la versión en serie para clases en Java. La utilidad también tiene una GUI, que se habilita al pasar el parámetro - show.

  5. La mejor práctica en serialización es declarar explícitamente SerialVersionUID, para evitar problemas con la deserialización, especialmente si está trabajando con una aplicación cliente-servidor que depende de datos serializados, como RMI.
Se trata SerialVersionUIDde Java. Ahora sabemos por qué es importante declarar correctamente SerialVersionUIDen clase. Puede agradecer a su IDE por este recordatorio, que potencialmente podría interrumpir la deserialización de su clase. Si desea leer más sobre serialización y conceptos relacionados, también puede consultar estos fantásticos artículos. Original aquí
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION