Вы правы в своих предположениях, в некотором смысле.
Должна быть возможность разбить набор всех объектов в программе на группы
1) У вас есть полная информация, которая позволяет выполнить полную реконструкцию и реконструкцию объекта. Массивы чисел или строк, структуры являются хорошими примерами.
2) У вас есть строительная информация. Вы можете восстановить объект, вызвав внешний код. Файл является хорошим примером, но он требует, чтобы ваша программа имела файловую абстракцию, которая запоминает параметры построения и состояния. Мы можем, например, сохранить путь к файлу и позицию в файле. Однако реконструкция может потерпеть неудачу. (Например, файл был удален или изменен)
3) У вас нет информации о конструкции, объект был каким-то образом получен случайным образом.
Здесь, чтобы иметь возможность полностью сериализовать объекты, мы должны перейти от 3) к 2) к 1). Объекты в 3) могут быть атрибутами объекта типа 2) и могут быть получены путем успешного восстановления объекта типа 2).
Однако объект типа 2) должен быть реконструирован путем сериализации только информации о конструкции, которая должна иметь тип 1), например, чисел и строк, истинных данных.
Вся эта схема кажется дорогостоящей, поскольку, если мы хотим восстановить все состояние программы, нам придется работать с абстракциями, которые инкапсулируют объекты типа 2). И мы должны знать, что мы делаем, когда объект не может быть реконструирован. Кроме того, мы должны быть уверены, что мы не смешиваем объекты этих типов, что мы не смешиваем объекты типа 3 или 2, где мы ожидаем собрать только объекты типа 1.