Java for Beginner
675 subscribers
558 photos
156 videos
12 files
851 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Сериализация и десериализация объектов

Сериализация — это процесс преобразования объекта в последовательность байтов, которая может быть сохранена в файл или передана по сети.
Десериализация — это обратный процесс, при котором байты преобразуются обратно в объект. Эти процессы позволяют сохранять состояние объекта и восстанавливать его в любой момент.


Сериализация

Для того чтобы объект можно было сериализовать, его класс должен реализовывать интерфейс Serializable. Этот интерфейс является маркерным, то есть не содержит методов и служит лишь для указания JVM, что объекты этого класса могут быть сериализованы.

Пример класса, реализующего Serializable:
import java.io.Serializable;

class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}

В этом примере класс Person реализует Serializable, что позволяет его объекты сериализовать.


Процесс сериализации:

Создаем объект ObjectOutputStream, связанный с выходным потоком (например, FileOutputStream).
Вызываем метод writeObject(Object obj) для записи объекта в поток.


Пример сериализации:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("John Doe", 30);

try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
}
}



Десериализация

Процесс десериализации включает чтение последовательности байтов и создание из них объекта. Для этого используется класс ObjectInputStream.

Процесс десериализации:


Создаем объект ObjectInputStream, связанный с входным потоком (например, FileInputStream).
Вызываем метод readObject() для чтения объекта из потока. Обязательно выполняем приведение типа (casting) к нужному классу.


Пример десериализации:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserializationExample {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject();
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}


serialVersionUID

Каждый сериализуемый класс должен иметь статическое поле serialVersionUID, которое используется для обеспечения совместимости версий класса. Если serialVersionUID у класса изменится, десериализация объектов, сериализованных с предыдущей версией класса, вызовет ошибку.


Пример объявления serialVersionUID:
class Person implements Serializable {
private static final long serialVersionUID = 1L;
// остальные поля и методы
}


Транзиентные поля

Поля, помеченные ключевым словом transient, не будут сериализованы. Это полезно для полей, которые не нужно сохранять, например, паролей или других конфиденциальных данных.


Пример использования transient:
class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private transient String password;

public User(String username, String password) {
this.username = username;
this.password = password;
}

@Override
public String toString() {
return "User{username='" + username + "', password='" + password + "'}";
}
}

В этом примере поле password не будет сериализовано.

#Java #Training #IO #Serializable