0Pricing
Java Academy · Lekcja

Pola transient i serialVersionUID

Wykluczaj wrażliwe pola za pomocą transient i zachowuj zgodność wersji dzięki serialVersionUID.

Pola transient i serialVersionUID to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Dlaczego transient?

Niektóre pola nie powinny być zapisywane, na przykład hasła, otwarte uchwyty plików lub wyniki obliczeń przechowywane w pamięci podręcznej. Należy oznaczyć je jako transient, aby zostały pominięte podczas serializacji.

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

Wartość pola transient po deserializacji

Po deserializacji pola transient otrzymują domyślne wartości Javy: null dla obiektów, 0 dla liczb i false dla wartości logicznych.

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

Czym jest serialVersionUID?

serialVersionUID to stała typu long, która pełni funkcję znacznika wersji. Jeśli klasa ulegnie zmianie, a UID nie będzie zgodny z wartością zapisaną w pliku, deserializacja zgłosi InvalidClassException.

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

Automatycznie generowany a jawnie zadeklarowany UID

Jeśli pominięto serialVersionUID, Java generuje go na podstawie struktury klasy. Każda zmiana pola powoduje po cichu zmianę UID, przez co stare dane przestają działać. Należy zawsze deklarować go jawnie.

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

InvalidClassException przy niezgodności wersji

Podczas odczytywania starych serializowanych danych za pomocą klasy, której UID uległ zmianie, Java zgłasza InvalidClassException: local class incompatible: stream classdesc serialVersionUID = X, local class serialVersionUID = Y.

Bezpieczny rozwój klasy

Można bezpiecznie dodawać nowe pola do klasy serializowalnej bez zmiany UID. Stare strumienie zostaną zdeserializowane, a nowe pole otrzyma swoją wartość domyślną. Usuwanie lub zmiana nazw pól jest bardziej ryzykowna.

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 i leniwa inicjalizacja

Typowy wzorzec polega na oznaczeniu pola przechowującego wynik buforowany lub pochodny jako transient, a następnie obliczeniu go ponownie w sposób leniwy po deserializacji za pomocą readResolve lub w metodzie pobierającej.

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;
    }
}

Pola static nigdy nie są serializowane

Pola static należą do klasy, a nie do instancji. Nigdy nie są uwzględniane w serializowanym strumieniu — serializowane są wyłącznie pola instancji.

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

Korzystanie z narzędzia serialver

Narzędzie JDK serialver wyświetla domyślny serialVersionUID klasy: serialver com.example.User. Można go użyć, aby uzyskać tę wartość przed jawnym dodaniem jej do klasy.

Externalizable jako alternatywa

Externalizable rozszerza Serializable i zapewnia pełną kontrolę za pomocą writeExternal / readExternal — jest przydatne, gdy potrzebują Państwo jawnie kontrolować pola bez używania 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();
    }
}

Najlepsze praktyki

Należy zawsze deklarować serialVersionUID. Hasła, uchwyty i dane w pamięci podręcznej należy oznaczać jako transient. Przy wprowadzaniu niezgodnych zmian należy zwiększać UID. Warto również dokumentować historię wersji.

Szybkie sprawdzenie

Jaką wartość ma pole typu transient int po deserializacji?

Podsumowanie

Należy używać transient, aby wykluczać pola z serializacji. Zawsze należy deklarować serialVersionUID, aby kontrolować wersjonowanie. Pola static nigdy nie są serializowane.

Często zadawane pytania

Czy lekcja „Pola transient i serialVersionUID” jest bezpłatna?

Tak — pełny tekst „Pola transient i serialVersionUID” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Pola transient i serialVersionUID”?

Wykluczaj wrażliwe pola za pomocą transient i zachowuj zgodność wersji dzięki serialVersionUID. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Pola transient i serialVersionUID”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy serializacji w Javie
  2. Pola transient i serialVersionUID
  3. Własna serializacja: writeObject i readObject
  4. Nowoczesne alternatywy: JSON i Protocol Buffers
← Powrót do Java Academy