Java Academy · Lektion

transient-felter og serialVersionUID

Udelad følsomme felter med transient, og bevar versionskompatibilitet med serialVersionUID.

Lektion 2 af 413 trin

transient-felter og serialVersionUID er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Hvorfor transient?

Nogle felter bør ikke gemmes: adgangskoder, åbne filhåndtag og cachelagrede beregninger. Markér dem med transient, så springes de over under serialiseringen.

public class Session implements Serializable {
    private String username;
    private transient String password;   // NOT serialized
    private transient Connection dbConn; // NOT serialized
}

Værdien af et transient-felt efter deserialisering

Efter deserialisering får transient-felter deres Java-standardværdi: null for objekter, 0 for tal og false for booleske værdier.

Session s = (Session) ois.readObject();
System.out.println(s.username);  // "alice"
System.out.println(s.password);  // null  (transient)

Hvad er serialVersionUID?

serialVersionUID er en long-konstant, der fungerer som et versionsstempel. Hvis klassen ændres, og UID'en ikke stemmer overens med den i filen, kaster deserialiseringen en InvalidClassException.

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
}

Automatisk genereret eller eksplicit UID

Hvis du udelader serialVersionUID, genererer Java en ud fra klassens struktur. Enhver ændring af et felt ændrer ubemærket UID'en, så gamle data ikke længere kan bruges. Deklarér den altid eksplicit.

import java.io.ObjectStreamClass;
long uid = ObjectStreamClass.lookup(User.class).getSerialVersionUID();
System.out.println(uid); // e.g. 3526749255685047947

InvalidClassException ved versionsuoverensstemmelse

Når du læser gamle serialiserede data med en klasse, hvis UID er ændret, kaster Java en InvalidClassException: local class incompatible: stream classdesc serialVersionUID = X, local class serialVersionUID = Y.

Sikker udvikling af klasser

Du kan uden problemer føje nye felter til en serialiserbar klasse uden at ændre UID'en. Gamle strømme deserialiseres med det nye felt sat til dets standardværdi. Det er mere risikabelt at fjerne eller omdøbe felter.

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 forsinket initialisering

Et almindeligt mønster er at markere et cachelagret eller afledt felt med transient og beregne det igen efter behov efter deserialisering ved hjælp af 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-felter serialiseres aldrig

static-felter tilhører klassen, ikke instansen. De medtages aldrig i den serialiserede strøm — kun instansfelter serialiseres.

public class Counter implements Serializable {
    private static final long serialVersionUID = 1L;
    private static int instanceCount = 0; // NOT serialized
    private int value;
}

Brug af værktøjet serialver

JDK-værktøjet serialver udskriver en klasses standardværdi for serialVersionUID: serialver com.example.User. Brug det til at finde værdien, før du tilføjer den eksplicit.

Externalizable som alternativ

Externalizable udvider Serializable og giver fuld kontrol via writeExternal og readExternal — nyttigt, når du vil have eksplicit kontrol over felterne uden at bruge 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();
    }
}

Bedste praksis

Deklarér altid serialVersionUID. Markér adgangskoder, håndtag og cacher med transient. Forøg UID'en ved inkompatible ændringer. Dokumentér versionshistorikken.

Hurtigt tjek

Hvilken værdi har et transient int-felt efter deserialisering?

Opsummering

Brug transient til at udelukke felter fra serialisering. Deklarér altid serialVersionUID for at styre versioneringen. Static-felter serialiseres aldrig, uanset hvad.

Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “transient-felter og serialVersionUID” gratis?

Ja — hele teksten til “transient-felter og serialVersionUID” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “transient-felter og serialVersionUID”?

Udelad følsomme felter med transient, og bevar versionskompatibilitet med serialVersionUID. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “transient-felter og serialVersionUID”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Grundlæggende Java-serialisering
  2. transient-felter og serialVersionUID
  3. Brugerdefineret serialisering: writeObject og readObject
  4. Moderne alternativer: JSON og Protocol Buffers
← Tilbage til Java Academy