Perché il compilatore Java creare un serialVersionUID campo sintetico?
-
29-10-2019 - |
Domanda
Come parte di debug di un'applicazione, ho notato che Field.getDeclaredFields()
restituisce alcuni campi sintetici, tra cui un serialVersionUID
campo in una classe che estende un'interfaccia, anche se nessuno estendere Serializable
.
Perché il compilatore aggiungere questi campi?
AGGIORNAMENTO
Infatti, c'è anche un $VRc
campo sintetico creato.
Soluzione
Il compilatore Java/runtime non crea automaticamente un serialVersionUID campo.Ho il sospetto che si sta utilizzando una qualche forma di bytecode enchancement quadro sotto il cofano che è incaricato di aggiungere i campi sintetici o in fase di runtime o a tempo di compilazione.
Il $VRc
campo prodotto da Emma strumentazione quadro, in modo che sarebbe la ragione di almeno uno dei campi sintetici.
Il serialVersionUID
il campo è anche aggiunto da Emma, quando il instr.do_suid_compensation
la proprietà è impostata su true.
Altri suggerimenti
Questo campo è essenziale per Java serializzazione. In breve: consente a JVM di scoprire che la classe che è stata serializzata (ad esempio salvata su disco) è stata cambiata in seguito e non può essere deserializzata in modo sicuro su oggetto.
Dai un'occhiata a Controllo della versione Capitolo del documento citato sopra, spiega come serialVersionUID
viene usato.
Aggiornamento: appena notato che la tua classe non implementa Serializable
. Sei sicuro che nessuna delle super classi o interfacce implementate non si estende Serializable
?