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. 3526749255685047947InvalidClassException 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
- Podstawy serializacji w Javie
- Pola transient i serialVersionUID
- Własna serializacja: writeObject i readObject
- Nowoczesne alternatywy: JSON i Protocol Buffers