Serialization
e
SerialVersionUID
rimane sempre un mistero per molti sviluppatori Java. Vedo spesso domande su cos'è
SerialVersionUID
o cosa succede se non dichiaro
SerialVersionUID
nella mia
Serializable
-class?
Oltre ad essere confuso e usato raramente, un altro motivo di questa domanda è l'avviso mancante dell'IDE Eclipse
SerialVersionUID
, ad esempio: "
La classe Serializable Customer non dichiara un campo SerialVersionUID finale staticoSerializable
di
Customer
tipo
SerialVersionUID
long " In questo articolo imparerai non solo le basi di Java
SerialVersionUID
ma anche il suo impatto sul processo di serializzazione e deserializzazione. Quando dichiari una classe, ad esempio
Serializable
implementando un'interfaccia token
java.io.Serializable
, il runtime Java memorizza un'istanza di quella classe su disco utilizzando il meccanismo di serializzazione predefinito a meno che non configuri il processo per utilizzare
l'interfaccia Externalizable . Durante la serializzazione, il runtime Java crea un numero di versione per la classe in modo da poterla deserializzare in seguito. In Java, questo numero di versione è noto come
SerialVersionUID
. Se, durante la deserializzazione,
SerialVersionUID
non c'è corrispondenza, il processo uscirà con un'eccezione
InvalidClassException
nello stream "
main
"
java.io.InvalidClassException
e stamperà anche il nome della classe e il file
SerialVersionUID
. Una soluzione rapida per risolvere questo problema è copiarlo
SerialVersionUID
e definirlo come costante di tipo
private
static
final
long
nella classe. In questo articolo impareremo perché dovremmo utilizzare
SerialVersionUID
Java e come utilizzare lo strumento JDK serialver per generare questo ID. Se sei nuovo alla serializzazione, puoi anche guardare le
10 migliori domande di intervista sulla serializzazione Java per valutare le tue conoscenze e trovare lacune nella tua comprensione per ulteriori letture. Come
Concurrency
(concorrenza) e
Multi-threading
(multithreading),
Serialization
(serializzazione) è un altro argomento che merita di essere letto più volte.
Perché utilizzare SerialVersionUID in Java
Come ho detto, quando non abbiamo definito un valore
SerialVersionUID
come
static
final
long
nella nostra classe, il meccanismo di serializzazione lo farà per noi. Questo meccanismo è sensibile a molti dettagli, inclusi i campi della classe, i loro modificatori di accesso, le interfacce che implementa e persino le diverse implementazioni del compilatore; qualsiasi modifica alla classe o l'uso di un compilatore diverso può produrre un risultato diverso,
SerialVersionUID
che alla fine sarà impedire che i dati serializzati vengano ricaricati. È rischioso fare affidamento sul meccanismo di serializzazione di Java per generare questo ID, motivo per cui è una buona idea definirlo esplicitamente
SerialVersionUID
nella
classe Serializable . Consiglio vivamente di leggere il classico Java -
Joshua Bloch "Effective Java" per comprendere la serializzazione Java e i problemi legati alla loro gestione errata. A proposito, JDK fornisce anche uno strumento
serialver
, situato nella directory
bin della directory
JAVA_HOME , sul mio computer,
C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , che può essere utilizzato per generare
SerialVersionUID
per le vecchie classi. Ciò è molto utile nel caso in cui hai apportato modifiche alla classe che interrompono la serializzazione e l'applicazione non è in grado di ricaricare le istanze serializzate. È possibile utilizzare facilmente questa utilità per creare
SerialVersionUID
vecchie istanze e quindi utilizzarla esplicitamente dichiarando il campo come
private static final long SerialVersionUID
. A proposito, per motivi di prestazioni e sicurezza è altamente raccomandato utilizzare il formato binario normale per la serializzazione; ancora una volta, "Effective Java" ha diversi paragrafi che dimostrano in grande dettaglio i vantaggi del formato normale.
Come utilizzare l'utilità JDK serialver per generare SerialVersionUID
È possibile utilizzare
serialver
per generare
SerialVersionUID
per le classi. Ciò è particolarmente utile per lo sviluppo di classi; l'utilità restituisce
SerialVersionUID
in un formato facile da copiare. È possibile utilizzare l'
serialver
utilità JDK come mostrato nell'esempio:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Puoi anche utilizzare l'utility
serialver
come
GUI
comando
$ serialver –show
: questo aprirà un ispettore
serial version
che prenderà il nome completo della classe e lo visualizzerà
Serial version
.
Riepilogo
Ora che sappiamo cos'è
SerialVersionUID
e perché è importante dichiararlo in una
Serializable
classe, è tempo di rivedere alcuni fatti importanti relativi a Java SerialVersionUID.
SerialVersionUID
utilizzato per indicare la versione dei dati serializzati.
- Quando non dichiariamo
SerialVersionUID
nella nostra classe, il runtime Java lo fa per noi, ma questo processo è sensibile a molti metadati della classe incluso il numero di campi, il tipo di campi, i modificatori di accesso ai campi, le interfacce implementate nella classe , ecc. È possibile trovare le informazioni esatte nella documentazione sulla serializzazione di Oracle.
- Si consiglia di dichiarare SerialVersionUID come variabile finale lunga statica privata per evitare il meccanismo predefinito. Alcuni IDE, come Eclipse , emettono anche avvisi se lo dimentichi, ad esempio: "La classe Serializable Customer non dichiara un campo SerialVersionUID finale statico di tipo long." . Sebbene sia possibile disabilitare questo avviso andando su Finestra > Preferenze > Java > Compilatore > Errori/Avvisi > Potenziali problemi di programmazione, suggerisco di non farlo. Solo quando il recupero dei dati non è richiesto posso trascurarlo. Ecco come appare questo errore nell'IDE Eclipse, tutto ciò che devi fare è prendere la prima decisione rapida.
- È inoltre possibile utilizzare l'utilità serialver del JDK per generare la versione seriale per le classi in Java. L'utilità dispone anche di una GUI, che viene abilitata quando si passa il parametro -
show
.
- La procedura migliore nella serializzazione è dichiarare esplicitamente
SerialVersionUID
, per evitare eventuali problemi con la deserializzazione, soprattutto se si lavora con un'applicazione client-server che si basa su dati serializzati, come RMI.
È tutto
SerialVersionUID
in Java. Ora sappiamo perché è importante dichiararsi correttamente
SerialVersionUID
in classe. Puoi ringraziare il tuo IDE per questo promemoria, che potrebbe potenzialmente interrompere la deserializzazione della tua classe. Se vuoi saperne di più sulla serializzazione e sui concetti correlati, puoi anche consultare questi fantastici articoli.
Originale
qui
GO TO FULL VERSION