Java Academy · Lektion

transient-fält och serialVersionUID

Uteslut känsliga fält med transient och bevara versionskompatibilitet med serialVersionUID.

Lektion 2 av 413 steg

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. 3526749255685047947

InvalidClassException 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.

Gratis att börja

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

  1. Grunderna i Java-serialisering
  2. transient-fält och serialVersionUID
  3. Egen serialisering: writeObject och readObject
  4. Moderna alternativ: JSON och Protocol Buffers
← Tillbaka till Java Academy