Campi transient e serialVersionUID
Escluda i campi sensibili con transient e mantenga la compatibilità tra versioni con serialVersionUID.
Campi transient e serialVersionUID è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Perché transient?
Alcuni campi non dovrebbero essere salvati: password, handle di file aperti e risultati memorizzati nella cache. Li contrassegni come transient per escluderli durante la serializzazione.
public class Session implements Serializable {
private String username;
private transient String password; // NOT serialized
private transient Connection dbConn; // NOT serialized
}Valore di un campo transient dopo la deserializzazione
Dopo la deserializzazione, i campi transient ricevono il valore predefinito di Java: null per gli oggetti, 0 per i numeri e false per i valori booleani.
Session s = (Session) ois.readObject();
System.out.println(s.username); // "alice"
System.out.println(s.password); // null (transient)Che cos'è serialVersionUID?
serialVersionUID è una costante long che funge da identificatore di versione. Se la classe cambia e l'UID non corrisponde a quello presente nel file, durante la deserializzazione viene generata una InvalidClassException.
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
}UID generato automaticamente o esplicito
Se si omette serialVersionUID, Java ne genera uno a partire dalla struttura della classe. Qualsiasi modifica a un campo cambia silenziosamente l'UID, rendendo inutilizzabili i dati precedenti. Lo dichiari sempre in modo esplicito.
import java.io.ObjectStreamClass;
long uid = ObjectStreamClass.lookup(User.class).getSerialVersionUID();
System.out.println(uid); // e.g. 3526749255685047947InvalidClassException per incompatibilità di versione
Quando si leggono dati serializzati precedenti con una classe il cui UID è cambiato, Java genera InvalidClassException: local class incompatible: stream classdesc serialVersionUID = X, local class serialVersionUID = Y.
Evoluzione sicura delle classi
È possibile aggiungere in sicurezza nuovi campi a una classe serializzabile senza modificare l'UID. I flussi precedenti verranno deserializzati assegnando al nuovo campo il suo valore predefinito. Rimuovere o rinominare campi è più rischioso.
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private String email; // Added in v2 — safe if UID unchanged
}transient con inizializzazione lazy
Un modello comune consiste nel contrassegnare come transient un campo memorizzato nella cache o derivato e ricalcolarlo lazy dopo la deserializzazione, utilizzando readResolve o il getter.
public class Document implements Serializable {
private static final long serialVersionUID = 1L;
private String content;
private transient int wordCount = -1;
public int getWordCount() {
if (wordCount == -1) wordCount = content.split("\\s+").length;
return wordCount;
}
}I campi static non vengono mai serializzati
I campi static appartengono alla classe, non all'istanza. Non vengono mai inclusi nel flusso serializzato: vengono serializzati solo i campi dell'istanza.
public class Counter implements Serializable {
private static final long serialVersionUID = 1L;
private static int instanceCount = 0; // NOT serialized
private int value;
}Utilizzo dello strumento serialver
Lo strumento JDK serialver stampa il serialVersionUID predefinito di una classe: serialver com.example.User. Lo utilizzi per ottenere il valore prima di dichiararlo esplicitamente.
Externalizable come alternativa
Externalizable estende Serializable e offre il controllo completo tramite writeExternal / readExternal: è utile quando si desidera controllare esplicitamente i campi senza ricorrere a transient.
public class Config implements Externalizable {
private String host;
private transient String secret;
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(host);
}
public void readExternal(ObjectInput in) throws IOException {
host = in.readUTF();
}
}Buone pratiche
Dichiari sempre serialVersionUID. Contrassegni password, handle e dati memorizzati nella cache come transient. Incrementi l'UID quando apporta modifiche incompatibili. Documenti la cronologia delle versioni.
Verifica rapida
Quale valore ha un campo int transient dopo la deserializzazione?
Riepilogo
Utilizzi transient per escludere i campi dalla serializzazione. Dichiari sempre serialVersionUID per controllare la gestione delle versioni. I campi static non vengono mai serializzati, in ogni caso.
Domande Frequenti
La lezione «Campi transient e serialVersionUID» è gratuita?
Sì — il testo completo di «Campi transient e serialVersionUID» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Campi transient e serialVersionUID»?
Escluda i campi sensibili con transient e mantenga la compatibilità tra versioni con serialVersionUID. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Campi transient e serialVersionUID»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Nozioni di base sulla serializzazione Java
- Campi transient e serialVersionUID
- Serializzazione personalizzata: writeObject e readObject
- Alternative moderne: JSON e Protocol Buffers