Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Serialização e desserialização do Redis


o que causa problemas de desserialização?

Eu gostaria de lhe dar um pouco de fundo antes de responder sua pergunta,

O runtime de serialização associa a cada classe serializável um número de versão, chamado serialVersionUID, que é usado durante a desserialização para verificar se o remetente e o destinatário de um objeto serializado carregaram classes para esse objeto que são compatíveis com relação à serialização. Se o receptor carregou uma classe para o objeto que tem uma serialVersionUID diferente daquela da classe do remetente correspondente, a desserialização resultará em uma InvalidClassException.

Se uma classe serializável não declarar explicitamente um serialVersionUID, o tempo de execução de serialização calculará um valor serialVersionUID padrão para essa classe com base em vários aspectos da classe. Ele usa as seguintes informações da classe para calcular SerialVersionUID,
  1. O nome da classe.
  2. Os modificadores de classe escritos como um inteiro de 32 bits.
  3. O nome de cada interface classificado por nome.
  4. Para cada campo da classe classificado por nome de campo (exceto campos estáticos privados e transitórios privados:
  5. O nome do campo.
  6. Os modificadores do campo escritos como um inteiro de 32 bits.
  7. O descritor do campo.

  8. se existir um inicializador de classe, escreva o seguinte:

    O nome do método, .

    O modificador do método, java.lang.reflect.Modifier.STATIC, escrito como um inteiro de 32 bits.

    O descritor do método, ()V.

  9. Para cada construtor não privado classificado por nome de método e assinatura:

    O nome do método, .

    Os modificadores do método escrito como um inteiro de 32 bits.

    O descritor do método.

  10. Para cada método não privado classificado por nome de método e assinatura:

    O nome do método.

    Os modificadores do método escrito como um inteiro de 32 bits.

    O descritor do método.

Então, respondendo sua pergunta,

A remoção de uma propriedade pública/privada causaria algum problema? Adicionando novas propriedades, talvez? A adição de uma nova função à classe criaria problemas? Que tal mais construtores?

Sim, todas essas adições/remoções por padrão causarão o problema.

Mas uma maneira de superar isso é definir explicitamente o SerialVersionUID, isso informará ao sistema de serialização que eu sei que a classe evoluirá (ou evoluiu) ao longo do tempo e não gerará um erro. Assim, o sistema de desserialização lê apenas os campos que estão presentes em ambos os lados e atribui o valor. Os campos recém-adicionados no lado de desserialização obterão os valores padrão. Se alguns campos forem excluídos no lado da desserialização, o algoritmo apenas lê e pula.

A seguir está a maneira como se pode declarar o SerialVersionUID,
private static final long serialVersionUID = 3487495895819393L;