Podstawy serializacji w Javie
Implementuj Serializable, zapisuj obiekty do strumieni za pomocą ObjectOutputStream i odczytuj je ponownie.
Podstawy serializacji w Javie to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Czym jest serializacja w Javie?
Serializacja przekształca stan obiektu w strumień bajtów, aby można go było zapisać na dysku, wysłać przez sieć lub przechować w bazie danych. Deserializacja odwraca ten proces.
Interfejs znacznikowy Serializable
Aby serializować klasę, należy zaimplementować java.io.Serializable. Nie zawiera on żadnych metod — sygnalizuje maszynie JVM, że instancje tej klasy można serializować.
import java.io.Serializable;
public class User implements Serializable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override public String toString() { return name + " / " + age; }
}Zapisywanie obiektu za pomocą ObjectOutputStream
Należy opakować FileOutputStream w ObjectOutputStream i wywołać writeObject(), aby przeprowadzić serializację.
import java.io.*;
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("user.ser"))) {
oos.writeObject(new User("Alice", 30));
System.out.println("Serialized successfully");
}Odczytywanie obiektu za pomocą ObjectInputStream
Należy opakować FileInputStream w ObjectInputStream i wywołać readObject(), aby przeprowadzić deserializację. Wynik należy rzutować na oczekiwany typ.
import java.io.*;
try (ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("user.ser"))) {
User u = (User) ois.readObject();
System.out.println("Deserialized: " + u);
}Serializacja grafu obiektów
Wszystkie obiekty, do których odwołuje się serializowany obiekt, również muszą implementować Serializable, w przeciwnym razie w czasie wykonywania zostanie zgłoszony wyjątek NotSerializableException.
public class Order implements Serializable {
private User customer; // User must be Serializable
private List<String> items;
public Order(User customer, List<String> items) {
this.customer = customer;
this.items = items;
}
}NotSerializableException
Jeśli którekolwiek pole w grafie obiektów nie jest serializowalne i nie zostało oznaczone jako transient, Java zgłasza NotSerializableException podczas zapisu.
// Thread is NOT Serializable
public class Task implements Serializable {
private Thread worker; // throws NotSerializableException!
// Fix: mark as transient
private transient Thread worker2;
}Graf obiektów i współdzielone referencje
Java śledzi tożsamość obiektów podczas serializacji. Jeśli dwa pola wskazują ten sam obiekt, zapisywana jest tylko jedna kopia, a oba pola wskazują tę samą instancję po deserializacji.
Serializacja kolekcji
Standardowe kolekcje, takie jak ArrayList, HashMap i LinkedList, już implementują Serializable, więc są serializowane, o ile ich elementy również są serializowalne.
List<String> names = new ArrayList<>(List.of("Alice", "Bob"));
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("names.ser"))) {
oos.writeObject(names);
}Dziedziczenie i serializacja
Jeśli nadklasa implementuje Serializable, wszystkie podklasy również są serializowalne. Jeśli nadklasa nie jest serializowalna, jej pola nie zostaną zapisane, a sama nadklasa musi mieć konstruktor bezargumentowy, aby możliwa była deserializacja.
Weryfikowanie strumienia bajtów
Serializowany strumień bajtów rozpoczyna się od bajtów sygnatury 0xACED 0x0005. Można go przeanalizować za pomocą edytora szesnastkowego lub zdekodować przy użyciu narzędzi SerialVer, aby zrozumieć jego format.
Ostrzeżenie dotyczące bezpieczeństwa
Deserializacja w Javie jest znanym wektorem ataku. Nie należy nigdy deserializować danych z niezaufanych źródeł bez ich uprzedniej walidacji. W przypadku danych zewnętrznych należy preferować JSON, Protobuf lub podpisane koperty.
Szybkie sprawdzenie
Jaka metoda serializuje obiekt do strumienia?
Podsumowanie
Serializacja w Javie korzysta z ObjectOutputStream / ObjectInputStream. Klasy muszą implementować Serializable. Należy unikać serializowania niezaufanych danych i preferować nowoczesne rozwiązania w nowym kodzie.
Często zadawane pytania
Czy lekcja „Podstawy serializacji w Javie” jest bezpłatna?
Tak — pełny tekst „Podstawy serializacji w Javie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Podstawy serializacji w Javie”?
Implementuj Serializable, zapisuj obiekty do strumieni za pomocą ObjectOutputStream i odczytuj je ponownie. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Podstawy serializacji w Javie”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy serializacji w Javie
- Pola transient i serialVersionUID
- Własna serializacja: writeObject i readObject
- Nowoczesne alternatywy: JSON i Protocol Buffers