Я работаю над чем-то похожим последние несколько месяцев. Я не мог использовать Boost, потому что задача состояла в том, чтобы сериализовать группу существующих классов (огромную существующую кодовую базу), и было неуместно иметь классы, наследуемые от интерфейса, который имел виртуальную функцию serialize () (мы не хотели множественного наследования) .
Используемый подход имел следующие существенные особенности:
- Создайте вспомогательный класс для каждого существующего класса, назначенный задачей сериализации этого конкретного класса, и сделайте вспомогательный класс другом сериализуемого класса. Это позволяет избежать введения наследования в сериализуемый класс, а также предоставляет вспомогательному классу доступ к закрытым переменным.
- Пусть каждый из вспомогательных классов (назовем их «сериализаторами») зарегистрирует себя в глобальной карте. Каждый класс сериализатора реализует виртуальную функцию clone () (шаблон 'prototype'), которая позволяет извлекать указатель на сериализатор по имени класса из этой карты. Имя получено с использованием информации RTTI для конкретного компилятора. Регистрация в глобальной карте осуществляется путем создания экземпляров статических указателей и их «нового», поскольку статические переменные создаются до запуска программы.
- Был создан специальный объект потока (полученный из
std::fstream
), который содержал шаблонные функции для сериализации не указателей, указателей и типов данных STL. Потоковый объект может быть открыт только в режимах только для чтения или только для записи (по замыслу), поэтому одну и ту же функцию serialize () можно использовать для чтения из файла или записи в файл, в зависимости от режима, в котором поток был открыт. Таким образом, нет вероятности какого-либо несоответствия в порядке чтения и записи членов класса.
- Для каждого объекта, который был сохранен или восстановлен, был создан уникальный тег (целое число) на основе адреса переменной и сохранен на карте. Если тот же адрес возник снова, был сохранен только тег, а не сам глубоко скопированный объект. Таким образом, каждый объект был глубоко скопирован в файл только один раз.
На странице в Интернете представлены некоторые из этих идей, которыми вы поделились выше: http://www.cs.sjsu.edu/~pearce/modules/lectures/cpp/Serialization.htm. Надеюсь, что это поможет.