Serializacja w Java to proces konwersji stanu obiektu na strumień bajtów, aby można go było przesyłać przez sieć, zapisywać do pliku lub przechowywać w bazie danych. W przypadku pól statycznych zachowanie jest jednak specyficzne i różni się od zwykłych pól obiektu. W tej lekcji przeanalizujemy, jak pola statyczne są traktowane podczas serializacji i deserializacji w Java.
Przykład kodu
Zacznijmy od prostego przykładu klasy, która implementuje Serializable i posiada zarówno pola statyczne, jak i niestatyczne.
import java.io.*;
// Klasa testowa implementująca Serializable
public class SerializationTest implements Serializable {
    // Pole statyczne
    static int staticField = 10;
    // Pole niestatyczne
    int nonStaticField;
    // Konstruktor ustawiający wartość pola niestatycznego
    public SerializationTest(int value) {
        this.nonStaticField = value;
    }
    // Metoda główna
    public static void main(String[] args) {
        SerializationTest testObject = new SerializationTest(20);
        // Serializacja obiektu
        try (ObjectOutputStream out = new ObjectOutputStream(
                new FileOutputStream("object.dat"))) {
            out.writeObject(testObject);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // Zmiana wartości pola statycznego
        staticField = 30;
        // Deserializacja obiektu
        try (ObjectInputStream in = new ObjectInputStream(
                new FileInputStream("object.dat"))) {
            SerializationTest loadedObject = (SerializationTest) in.readObject();
            System.out.println("Pole statyczne: " + staticField);
            System.out.println("Pole niestatyczne: " + loadedObject.nonStaticField);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
Komentarze do kodu
- static int staticField = 10;// Inicjalizacja pola statycznego.
- int nonStaticField;// Definicja pola niestatycznego.
- W metodzie main, najpierw tworzymy obiekt i serializujemy go do pliku. Następnie zmieniamy wartość pola statycznego i deserializujemy obiekt.
- Po deserializacji, wartość pola statycznego, która jest wyświetlana, to wartość aktualnie przypisana do pola w klasie (staticField = 30;), a nie wartość, która była w momencie serializacji.
Podsumowanie
Pola statyczne nie są częścią stanu obiektu z perspektywy serializacji, ponieważ są one związane z klasą, a nie z konkretnym obiektem. Dlatego też serializacja nie uwzględnia ich stanu – podczas deserializacji wartością pola statycznego jest wartość aktualnie przypisana do tego pola w klasie, niezależnie od tego, jaka wartość była przypisana w momencie serializacji. To ważne zrozumienie, gdyż może wpływać na zachowanie aplikacji, zwłaszcza w rozproszonych systemach.
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.

