Redis
 sql >> Database >  >> NoSQL >> Redis

Serializzazione e deserializzazione Redis

Quali sono le cause dei problemi di deserializzazione?

Vorrei darti un po' di background prima di rispondere alla tua domanda,

Il runtime di serializzazione associa a ciascuna classe serializzabile un numero di versione, denominato serialVersionUID, che viene utilizzato durante la deserializzazione per verificare che il mittente e il destinatario di un oggetto serializzato abbiano caricato classi per quell'oggetto compatibili rispetto alla serializzazione. Se il destinatario ha caricato una classe per l'oggetto che ha un serialVersionUID diverso da quello della classe del mittente corrispondente, la deserializzazione risulterà in un'eccezione InvalidClassException.

Se una classe serializzabile non dichiara esplicitamente un serialVersionUID, il runtime di serializzazione calcolerà un valore serialVersionUID predefinito per quella classe in base a vari aspetti della classe. Utilizza le seguenti informazioni della classe per calcolare SerialVersionUID,

  1. Il nome della classe.
  2. I modificatori di classe scritti come un intero a 32 bit.
  3. Il nome di ogni interfaccia ordinata per nome.
  4. Per ogni campo della classe ordinato in base al nome del campo (tranne i campi privati ​​statici e transitori privati:
  5. Il nome del campo.
  6. I modificatori del campo scritti come un intero a 32 bit.
  7. Il descrittore del campo.
  8. se esiste un inizializzatore di classe, scrivi quanto segue:

    Il nome del metodo, .

    Il modificatore del metodo, java.lang.reflect.Modifier.STATIC, scritto come intero a 32 bit.

    Il descrittore del metodo, ()V.

  9. Per ogni costruttore non privato ordinato per nome del metodo e firma:

    Il nome del metodo, .

    I modificatori del metodo scritti come numero intero a 32 bit.

    Il descrittore del metodo.

  10. Per ogni metodo non privato ordinato per nome metodo e firma:

    Il nome del metodo.

    I modificatori del metodo scritti come numero intero a 32 bit.

    Il descrittore del metodo.

Quindi, per rispondere alla tua domanda,

La rimozione di un immobile pubblico/privato potrebbe causare problemi? Aggiungere nuove proprietà, forse? L'aggiunta di una nuova funzione alla classe creerebbe problemi? Che ne dici di più costruttori?

Sì, tutte queste aggiunte/rimozioni per impostazione predefinita causeranno il problema.

Ma un modo per superare questo problema è definire esplicitamente SerialVersionUID, questo dirà al sistema di serializzazione che so che la classe si evolverà (o si evolverà) nel tempo e non genererà un errore. Quindi il sistema di deserializzazione legge solo quei campi che sono presenti in entrambi i lati e assegna il valore. I campi appena aggiunti sul lato della deserializzazione otterranno i valori predefiniti. Se alcuni campi vengono eliminati sul lato della deserializzazione, l'algoritmo legge e salta.

Di seguito è riportato il modo in cui si può dichiarare SerialVersionUID,

private static final long serialVersionUID = 3487495895819393L;