Serializacja w Javie to proces zapisywania stanu obiektu do strumienia bajtów, co umożliwia jego trwałe zapisanie na dysku lub przesłanie przez sieć. Nie wszystkie pola obiektu muszą być jednak serializowane, zwłaszcza jeśli zawierają dane tymczasowe lub nie są istotne dla reprezentacji obiektu. Aby wykluczyć pola z procesu serializacji, możemy użyć modyfikatora transient
. W tym artykule przyjrzymy się, jak to działa na praktycznym przykładzie.
Przykład użycia transient
w Javie
Załóżmy, że tworzymy aplikację do zarządzania kontami użytkowników, gdzie każde konto zawiera dane osobowe oraz statystyki odwiedzin, które nie muszą być serializowane. Poniżej znajduje się przykład klasy UserAccount
z zastosowaniem transient
.
import java.io.*;
// Klasa reprezentująca konto użytkownika
public class UserAccount implements Serializable {
private String username; // nazwa użytkownika
private transient int loginCount; // liczba logowań, nie serializowane
// Konstruktor klasy UserAccount
public UserAccount(String username) {
this.username = username;
this.loginCount = 0;
}
// Metoda zwiększająca liczbę logowań
public void incrementLoginCount() {
loginCount++;
}
// Metoda do wyświetlenia danych konta
public String display() {
return "User: " + username + ", Logins: " + loginCount;
}
// Metoda main do demonstracji serializacji
public static void main(String[] args) {
UserAccount user = new UserAccount("JanKowalski");
user.incrementLoginCount();
user.incrementLoginCount();
try {
// Serializacja obiektu
FileOutputStream fileOut = new FileOutputStream("UserAccount.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(user);
out.close();
fileOut.close();
System.out.println("Obiekt został zserializowany: " + user.display());
// Deserializacja obiektu
FileInputStream fileIn = new FileInputStream("UserAccount.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
UserAccount savedUser = (UserAccount) in.readObject();
in.close();
fileIn.close();
System.out.println("Obiekt został odczytany: " + savedUser.display());
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Klasa UserAccount nie została znaleziona.");
c.printStackTrace();
return;
}
}
}
Podsumowanie
Jak widać z powyższego przykładu, pole oznaczone jako transient
nie jest zapisywane podczas serializacji obiektu. W wyniku deserializacji wartość tego pola nie zostanie przywrócona i zazwyczaj będzie miała wartość domyślną dla typu (w przypadku int
będzie to 0
). Użycie transient
jest przydatne, kiedy chcemy zredukować rozmiar zapisywanego obiektu lub kiedy niektóre dane są tylko tymczasowe i nie są potrzebne po odtworzeniu obiektu z pliku.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.