Jak oznaczenie pola jako transient umożliwia serializację obiektu w Java?

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.

Scroll to Top