Come determinare un ID versione seriale corretto? Dovrebbe essere un grande valore lungo usando alcuni generatori o qualsiasi intero wld sufficiente?Come determinare un ID versione seriale corretto?
risposta
Francamente, fintanto che lo serialVersionUID
differisce tra le diverse versioni della classe, è tutto ciò che conta.
Che cosa sarebbe male se ci sono due versioni della stessa classe con campi serializzabili diversi aventi lo stesso serialVersionUID
- questo probabilmente causerà un problema quando si esegue la serializzazione.
Inoltre, se le modifiche alla classe non influiscono sulla serializzazione (ad esempio, i campi serializzabili nella classe rimangono gli stessi), lo serialVersionUID
può rimanere lo stesso.
IDE come Eclipse genereranno automaticamente un ID per le classi che implementano Serializable
in base ai campi e altre informazioni relative alla classe, in modo che possa essere la via più facile da prendere per generare un ID univoco.
Per ulteriori informazioni sull'argomento, lo Discover the secrets of the Java Serialization API sarebbe una buona lettura. C'è una sezione chiamata "Controllo versione" che discute il problema serialVersionUID
.
Lo strumento serialver viene fornito con il kit di sviluppo Java di Sun (JDK). Prende un nome di classe completo sulla riga di comando e restituisce l'ID della versione seriale per quella classe compilata, oppure può essere eseguito con il parametro "-show" per avviare una piccola GUI interattiva.
Quindi, se la classe è Foo, eseguire
serialver Foo
e si otterrà una sorta di output come questo:
Foo: static finale lungo serialVersionUID = -6618469841127325812L;
Prendere il codice che inizia con "statico" e inserirlo nella classe con altre variabili statiche. Ora l'ID della versione seriale è bloccato nella classe.
Possibili usi:
- versione - incrementarlo quando cambia la classe in un modo non incompatibile;
- timestamp: imposta il timestamp corrente, ad es.
200906121213
quando la classe cambia in modo incompatibile.
cosa significa il tuo secondo punto? impostandolo su timestamo lo rende incompatibile? o non è una pratica corretta. –
Ci scusiamo: quindi -> quando. Risolverà. –
Aggiungendo alla risposta alcune cose da fare attenzione prima di generare serialVersionUID usando l'utilità java serialver.
Percorso JDK fino allo scomparto da impostare nelle variabili di ambiente. Altrimenti è possibile che "serialver" non venga riconosciuto come comando interno o esterno ".
Aggiungi percorso classe in cui si trova il file di classe o vai alla directory in cui è presente il file di classe.
run serialver. Ciò fornirà SerialID.
Il passaggio del nome di classe a questa utilità non include.estensione di classe.
Osservazione: per un dato ID seriale della classe rimane lo stesso fino a quando non cambiamo la classe. Generarlo da Eclipse ti darà anche lo stesso risultato. – Varun
prompt dei comandi di avvio
Tipo di seguito:
cd \
quindi digitare di seguito
[serialver] [spazio] -classpath [spazio] [percorso del file di classe] [spazio] [nome file classe]
, ad es.
serialver -classpath C: \ Users \ Documents nileshjadav \ java \ file_io \ ByteStreamDemo
si prega di non aggiungere un'estensione come ByteStreamDemo.java o ByteStreamDemo.class semplicemente utilizzati solo ByteStreamDemo
OK mia domanda era più di ciò che rende un buon serialVersionUID. Perché non posso inizializzare con 1, piuttosto che passare attraverso il processo ingombrante o generarlo. –
È possibile iniziare da 1, purché si ricordi di incrementarlo manualmente ogni volta che è necessario cambiarlo. Oppure puoi lasciare che il tuo IDE o anche il tuo JRE lo generino per te. Il trucco è assicurarti che cambi esattamente ogni volta che è necessario, e non più frequentemente. La generazione di IDE è un compromesso ragionevole, ma un trigger di check-in nel tuo sistema SCM sarebbe ancora meglio ... –