3. Опишите процесс сериализации/десериализации с использованием Serializable.
UNKNOWNПри использовании Serializable применяется алгоритм сериализации, который с помощью рефлексии (Reflection API) выполняет:
- запись в поток метаданных о классе, ассоциированном с объектом (имя класса, идентификатор SerialVersionUID, идентификаторы полей класса);
- рекурсивную запись (загоняются все классы по очереди) в поток описания суперклассов до класса Java.lang.Object (не включительно);
- запись примитивных значений полей сериализуемого экземпляра, начиная с полей самого верхнего суперкласса;
- рекурсивную запись объектов, которые являются полями сериализуемого объекта.
Рефлексия (от позднелат. reflexio — обращение назад) — это механизм исследования данных о программе во время её выполнения. Рефлексия позволяет исследовать информацию о полях, методах и конструкторах классов.
При этом ранее сериализованные объекты повторно не сериализуются, что позволяет алгоритму корректно работать с циклическими ссылками.
Для выполнения десериализации под объект выделяется память, после чего его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается.
Однако при десериализации будет вызван конструктор без параметров родительского несериализуемого класса, а его отсутствие повлечет ошибку десериализации.
Для сериализации объектов в поток используется класс ObjectOutputStream. Он записывает данные в поток.
void writeObject(Object obj): записывает в поток отдельный объект
void close(): закрывает поток
void flush(): очищает буфер и сбрасывает его содержимое в выходной поток
Для десериализации – ObjectInputStream.
Object readObject(): считывает из потока объект
void close(): закрывает поток
Предыдущий вопрос: 2. Для чего нужна сериализация?
Следующий вопрос: 4. Как изменить стандартное поведение сериализации/десериализации?
Все вопросы по теме: список
Все темы: список
Вопросы/замечания/предложения/нашли ошибку: напишите мне