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.