sql >> Base de Datos >  >> NoSQL >> Redis

Serialización y deserialización de Redis

¿Qué causa los problemas de deserialización?

Me gustaría brindarle un poco de información antes de responder a su pregunta,

El tiempo de ejecución de serialización asocia con cada clase serializable un número de versión, llamado serialVersionUID, que se usa durante la deserialización para verificar que el remitente y el receptor de un objeto serializado hayan cargado clases para ese objeto que sean compatibles con respecto a la serialización. Si el receptor ha cargado una clase para el objeto que tiene un serialVersionUID diferente al de la clase del remitente correspondiente, la deserialización dará como resultado una InvalidClassException.

Si una clase serializable no declara explícitamente un serialVersionUID, entonces el tiempo de ejecución de serialización calculará un valor serialVersionUID predeterminado para esa clase en función de varios aspectos de la clase. Utiliza la siguiente información de la clase para calcular SerialVersionUID,

  1. El nombre de la clase.
  2. Los modificadores de clase escritos como un número entero de 32 bits.
  3. El nombre de cada interfaz ordenada por nombre.
  4. Para cada campo de la clase ordenado por nombre de campo (excepto campos privados estáticos y transitorios privados:
  5. El nombre del campo.
  6. Los modificadores del campo escritos como un número entero de 32 bits.
  7. El descriptor del campo.
  8. si existe un inicializador de clase, escribe 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.

  9. Para cada constructor no privado ordenado por nombre de método y firma:

    El nombre del método, .

    Los modificadores del método escritos como un entero de 32 bits.

    El descriptor del método.

  10. 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 un entero de 32 bits.

    El descriptor del método.

Entonces, para responder a tu pregunta,

¿Causaría un problema la eliminación de una propiedad pública o privada? ¿Agregar nuevas propiedades, tal vez? ¿Agregar una nueva función a la clase crearía problemas? ¿Qué tal más constructores?

Sí, todas estas adiciones/eliminaciones por defecto causarán el problema.

Pero una forma de superar esto es definir explícitamente SerialVersionUID, esto le dirá al sistema de serialización que sé que la clase evolucionará (o evolucionará) con el tiempo y no arrojará un error. Entonces, el sistema de deserialización lee solo aquellos campos que están presentes en ambos lados y asigna el valor. Los campos recién agregados en el lado de la deserialización obtendrán los valores predeterminados. Si se eliminan algunos campos en el lado de la deserialización, el algoritmo simplemente lee y omite.

La siguiente es la forma en que se puede declarar SerialVersionUID,

private static final long serialVersionUID = 3487495895819393L;