Механизм сериализации объектов предоставляет возможность записывать любой объект в поток ввода-вывода, а в дальнейшем читать его снова.
import com.algos.Sort;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
class Human implements Serializable {
private int age;
private String name;
...GeSe...
}
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
var out = new ObjectOutputStream(new FileOutputStream("human.dat"));
Human vasya = new Human(20, "Вася");
out.writeObject(vasya);
var in = new ObjectInputStream(new FileInputStream("human.dat"));
Human h1 = (Human) in.readObject();
}
}- Интерфейс Serializable не содержит методов, поэтому изменять каким-либо образом свои собственные классы не нужно
Сериализация связанных объектов
Что произойдет, если один объект совместно используется рядом других объектов?
Разумеется, сохранять и восстанавливать адреса ячеек нельзя - при повторной загрузке каждый такой объект будет занимать уже совершенно другую ячейку памяти, а не ту, которую он занимал первоначально.
Поэтому каждый такой объект сохраняется под серийным номером (отсюда и произошло название - сериализация).
При использовании Serializable применяется алгоритм сериализации, который с помощью рефлексии (Reflection API) выполняет:
- запись в поток метаданных о классе, ассоциированном с объектом (имя класса, идентификатор
SerialVersionUID, идентификаторы полей класса); - рекурсивную запись в поток описания суперклассов до класса
java.lang.Object(не включительно); - запись примитивных значений полей сериализуемого экземпляра, начиная с полей самого верхнего суперкласса;
- рекурсивную запись объектов, которые являются полями сериализуемого объекта.
При этом ранее сериализованные объекты повторно не сериализуются, что позволяет алгоритму корректно работать с циклическими ссылками.
Структура файлов для сериализации данных
