TLDR: я хотел бы перевести сериализацию класса с уровня реализации object_class_info
на object_serializable
, сохраняя совместимость со старыми файлами данных и всегда записывая файлы в новом формате.
Обоснование: когда я начал использовать библиотеку Boost Serialization, я не знал, что она уже поставляется с заголовком (complex.hpp), чтобы сериализовать std::complex<double>
. Вместо этого я написал свою собственную автономную функцию сериализации:
namespace boost { namespace serialization {
template<class Archive, typename T>
void serialize(Archive& ar, std::complex<T>& comp, const unsigned int version) {
ar & reinterpret_cast<T(&)[2]>(comp)[0];
ar & reinterpret_cast<T(&)[2]>(comp)[1];
}
}
Это по умолчанию включает отслеживание информации о версии и классе, что немного замедляет код. Функция сериализации, которая поставляется с Boost, работает немного быстрее.
Теперь я хотел бы перейти на использование версии Boost всегда при записи новых файлов данных, но при этом иметь возможность читать старые файлы данных. Чтение новых файлов со старым двоичным файлом не является проблемой.
Проблема в том, что новая сериализация не версионна (очевидно). Кроме того, я даже не представляю, как можно было бы пытаться читать в архиве, используя старую версию кода, и тут же снова записывать его, используя новую версию, поскольку трейты десериализации/сериализации являются глобальными свойствами.
Что было бы лучшим способом: а) прозрачно читать старые и новые файлы, всегда записывая новые файлы, или б) читать старый файл и сразу же записывать его в новом формате?