Механизм сериализации объектов предоставляет возможность записывать любой объект в поток ввода-вывода, а в дальнейшем читать его снова.

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 (не включительно);
  • запись примитивных значений полей сериализуемого экземпляра, начиная с полей самого верхнего суперкласса;
  • рекурсивную запись объектов, которые являются полями сериализуемого объекта.

При этом ранее сериализованные объекты повторно не сериализуются, что позволяет алгоритму корректно работать с циклическими ссылками.

Структура файлов для сериализации данных