transient-fält och serialVersionUID
Uteslut känsliga fält med transient och bevara versionskompatibilitet med serialVersionUID.
transient-fält och serialVersionUID är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.
Varför transient?
Vissa fält bör inte sparas: lösenord, öppna filhandtag och cachade beräkningar. Markera dem som transient så hoppas de över under serialiseringen.
public class Session implements Serializable {
private String username;
private transient String password; // NOT serialized
private transient Connection dbConn; // NOT serialized
}Värdet på ett transient-fält efter deserialisering
Efter deserialisering får transient-fält sina standardvärden i Java: null för objekt, 0 för tal och false för booleska värden.
Session s = (Session) ois.readObject();
System.out.println(s.username); // "alice"
System.out.println(s.password); // null (transient)Vad är serialVersionUID?
serialVersionUID är en long-konstant som fungerar som en versionsstämpel. Om klassen ändras och UID:t inte matchar det i filen kastar deserialiseringen InvalidClassException.
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
}Automatiskt genererat kontra explicit UID
Om serialVersionUID utelämnas genererar Java ett värde utifrån klassens struktur. Alla ändringar av fält ändrar UID:t i bakgrunden, vilket gör gamla data inkompatibla. Deklarera det alltid explicit.
import java.io.ObjectStreamClass;
long uid = ObjectStreamClass.lookup(User.class).getSerialVersionUID();
System.out.println(uid); // e.g. 3526749255685047947InvalidClassException vid versionskonflikt
När gamla serialiserade data läses med en klass vars UID har ändrats kastar Java InvalidClassException: local class incompatible: stream classdesc serialVersionUID = X, local class serialVersionUID = Y.
Säker vidareutveckling av klasser
Det går att lägga till nya fält i en serialiserbar klass utan att ändra UID:t. Gamla strömmar deserialiseras med det nya fältet satt till sitt standardvärde. Att ta bort eller byta namn på fält är farligare.
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 med lazy-initialisering
Ett vanligt mönster är att markera ett cachat eller härlett fält som transient och beräkna om det lazy efter deserialisering med readResolve eller i getter-metoden.
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;
}
}static-fält serialiseras aldrig
static-fält tillhör klassen, inte instansen. De tas aldrig med i den serialiserade strömmen – endast instansfält serialiseras.
public class Counter implements Serializable {
private static final long serialVersionUID = 1L;
private static int instanceCount = 0; // NOT serialized
private int value;
}Använda verktyget serialver
JDK-verktyget serialver skriver ut standardvärdet för serialVersionUID för en klass: serialver com.example.User. Använd det för att ta reda på värdet innan det deklareras explicit.
Externalizable som alternativ
Externalizable utökar Serializable och ger full kontroll via writeExternal / readExternal – användbart när explicit kontroll över fälten önskas utan 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();
}
}Rekommenderade metoder
Deklarera alltid serialVersionUID. Markera lösenord, handtag och cachar som transient. Öka UID:t när inkompatibla ändringar görs. Dokumentera versionshistoriken.
Snabbkontroll
Vilket värde har ett transient int-fält efter deserialisering?
Sammanfattning
Använd transient för att utesluta fält från serialisering. Deklarera alltid serialVersionUID för att styra versionshanteringen. Static-fält serialiseras aldrig, oavsett omständigheterna.
Lär dig Java med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 104
- Lektioner
- 374
Vanliga frågor
Är lektionen ”transient-fält och serialVersionUID” gratis?
Ja – hela texten till ”transient-fält och serialVersionUID” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”transient-fält och serialVersionUID”?
Uteslut känsliga fält med transient och bevara versionskompatibilitet med serialVersionUID. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Java Academy?
Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”transient-fält och serialVersionUID”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Java Academy-lektionen?
Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Grunderna i Java-serialisering
- transient-fält och serialVersionUID
- Egen serialisering: writeObject och readObject
- Moderna alternativ: JSON och Protocol Buffers