Serializacja w Javie to mechanizm przekształcania stanu obiektu na ciąg bajtów, aby można było go zapisać do pliku, przesłać przez sieć lub przechować w bazie danych. Proces ten umożliwia również deserializację, czyli odtworzenie obiektu z zapisanego stanu. Serializacja jest szczególnie użyteczna w aplikacjach wymagających wymiany danych między różnymi komponentami Javy działającymi w różnych środowiskach JVM.
Przykład: Serializacja i deserializacja obiektu User
W tym przykładzie stworzymy klasę User
, która będzie serializowalna, a następnie pokażemy, jak można serializować i deserializować obiekt tej klasy.
Klasa User
import java.io.Serializable;
// Klasa User implementująca interfejs Serializable
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private transient String password;
// transient - pole nie będzie serializowane
public User(String name, String password) {
this.name = name;
this.password = password;
}
// Gettery
public String getName() {
return name;
}
public String getPassword() {
return password;
}
// Settery
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
}
Serializacja obiektu User
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializeUser {
public static void main(String[] args) {
User user = new User("JanKowalski", "mojeHaslo123");
// Próba serializacji obiektu User do pliku
try (FileOutputStream fileOut = new FileOutputStream("user.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(user);
System.out.println("Obiekt User został zserializowany");
} catch (IOException i) {
i.printStackTrace();
}
}
}
Deserializacja obiektu User
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializeUser {
public static void main(String[] args) {
User user = null;
// Próba deserializacji obiektu User z pliku
try (FileInputStream fileIn = new FileInputStream("user.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
user = (User) in.readObject();
System.out.println("Obiekt User został odczytany");
System.out.println("Nazwa: " + user.getName());
// Hasło nie zostanie odczytane, ponieważ
// jest oznaczone jako transient
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Klasa User nie została znaleziona");
c.printStackTrace();
return;
}
if (user != null) {
System.out.println("Nazwa użytkownika: " + user.getName());
// Hasło jest null, ponieważ nie było serializowane
System.out.println("Hasło: " + user.getPassword());
}
}
}
Podsumowanie
Serializacja w Javie umożliwia zapisywanie i odczytywanie stanu obiektów, co jest niezwykle przydatne w wielu scenariuszach programistycznych, takich jak przechowywanie danych, przesyłanie obiektów między serwerami lub klientami w aplikacjach sieciowych. Ważne jest, aby pamiętać o słowie kluczowym transient
, które pozwala wykluczyć niektóre pola obiektu z procesu serializacji, co jest przydatne w kontekście bezpieczeństwa danych, jak pokazano na przykładzie pola password
w klasie User
.
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.