Jak zachowują się pola statyczne obiektu podczas serializacji w Java?

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.

Scroll to Top