JavaRush /Java Blog /Random-IT /Perché utilizzare SerialVersionUID all'interno della clas...
0xFF
Livello 9
Донецк

Perché utilizzare SerialVersionUID all'interno della classe Serializable in Java

Pubblicato nel gruppo Random-IT
Serializatione SerialVersionUIDrimane sempre un mistero per molti sviluppatori Java. Vedo spesso domande su cos'è SerialVersionUIDo cosa succede se non dichiaro SerialVersionUIDnella mia Serializable-class? Perché utilizzare SerialVersionUID all'interno della classe Serializable in Java - 1Oltre 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 Customertipo SerialVersionUIDlong " In questo articolo imparerai non solo le basi di Java SerialVersionUIDma anche il suo impatto sul processo di serializzazione e deserializzazione. Quando dichiari una classe, ad esempio Serializableimplementando 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, SerialVersionUIDnon c'è corrispondenza, il processo uscirà con un'eccezione InvalidClassExceptionnello stream " main" java.io.InvalidClassExceptione stamperà anche il nome della classe e il file SerialVersionUID. Una soluzione rapida per risolvere questo problema è copiarlo SerialVersionUIDe definirlo come costante di tipo private static final longnella classe. In questo articolo impareremo perché dovremmo utilizzare SerialVersionUIDJava 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 SerialVersionUIDcome static final longnella 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, SerialVersionUIDche 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 SerialVersionUIDnella 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 SerialVersionUIDper 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 SerialVersionUIDvecchie 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 serialverper generare SerialVersionUIDper le classi. Ciò è particolarmente utile per lo sviluppo di classi; l'utilità restituisce SerialVersionUIDin un formato facile da copiare. È possibile utilizzare l' serialverutilità 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 serialvercome GUIcomando $ serialver –show: questo aprirà un ispettore serial versionche prenderà il nome completo della classe e lo visualizzerà Serial version.

Riepilogo

Ora che sappiamo cos'è SerialVersionUIDe perché è importante dichiararlo in una Serializableclasse, è tempo di rivedere alcuni fatti importanti relativi a Java SerialVersionUID.
  1. SerialVersionUIDutilizzato per indicare la versione dei dati serializzati.

  2. Quando non dichiariamo SerialVersionUIDnella 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.

  3. 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. Perché utilizzare SerialVersionUID all'interno della classe Serializable in Java - 2

  4. È 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.

  5. 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 SerialVersionUIDin Java. Ora sappiamo perché è importante dichiararsi correttamente SerialVersionUIDin 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
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION