2011-09-12 11 views
9

Come parte del debug di un'applicazione, ho notato che Field.getDeclaredFields() restituisce alcuni campi sintetici, incluso un campo serialVersionUID in una classe che estende un'interfaccia, anche se nessuno estende Serializable.Perché il compilatore Java dovrebbe creare un campo sintetico serialVersionUID?

Perché il compilatore aggiunge tali campi?

UPDATE

Infatti, v'è anche un campo sintetico $VRc creato.

+0

Quale compilatore stai utilizzando? –

+0

I am on jdk1.6.0_26 – JVerstry

risposta

11

Il compilatore/runtime Java non creerà automaticamente un campo serialVersionUID. Sospetto che tu stia utilizzando un qualche tipo di framework di enchancement sotto il cofano che viene istruito per aggiungere i campi sintetici sia in fase di esecuzione, sia durante la compilazione.

Il campo $VRc è prodotta dal quadro strumentazione Emma, ​​così che sarebbe la ragione di almeno uno dei campi sintetici.

Il campo serialVersionUID è anche added by Emma, quando la proprietà instr.do_suid_compensation è impostata su true.

+0

Hai ragione, sto davvero utilizzando Emma per la copertura del test. Quando lo disattivo, i campi non ci sono più. – JVerstry

+0

Sì, anche serialVersionUID è anche [generato da Emma] (http://emma.sourceforge.net/reference/ch03s02.html#prop-ref.instr.do_suid_compensation) se è stata impostata una determinata proprietà. –

1

Questo campo è essenziale per Java serialization. In breve: consente alla JVM di scoprire che la classe che è stata serializzata (ad es. Salvata su disco) è stata modificata in seguito e non può essere deserializzata in modo sicuro all'oggetto.

Dai un'occhiata alla Version Control capitolo nel documento sopra citato, si spiega come serialVersionUID viene utilizzato.

AGGIORNAMENTO: appena notato, la classe non implementa Serializable. Sei sicuro che nessuna delle super classi o interfacce implementate non si estenda Serializable?

+3

Penso che la domanda sia più sul perché il campo sia stato aggiunto quando nessuna delle classi nella gerarchia dell'ereditarietà implementa l'interfaccia 'Serializable', non quale sia lo scopo del campo. –

+0

Sì, sicuro al 100%. È simile agli strumenti di classe A B e B è dichiarato come un'interfaccia. A e B non dichiarano alcun campo. Questo è tutto .. (e no, questo non riguarda il significato/l'uso degli UID della versione seriale) – JVerstry

Problemi correlati