На основании того факта, что std :: unique_ptr не сохраняет размер , ar& data;
в шаблонной функции "сериализации", которая используется для сохранения / загрузки данных членов не может быть сериализованным из-за количества данных, неизвестных в этой строке.
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar& data; // <== the count of data is unknown
ar& size;
}
Итеративный процесс (как показано в следующем коде) интеллектуального указателя «данные» необходим для доступа ко всем действительным data.
for (int i = 0; i < size; ++i)
ar& data[i];
Таким образом, часть сохранения выглядит следующим образом.
template<class Archive>
void save(Archive& ar, const unsigned int version) const
{
ar& size;
for (int i = 0; i < size; ++i)
ar& data[i];
}
Когда дело доходит до загрузки части, важно выделить пространство интеллектуального указателя перед загрузкой данных, чтобы избежать Ошибка нарушения доступа
template<class Archive>
void load(Archive& ar, const unsigned int version)
{
ar& size;
data = std::make_unique<int[]>(size); // <== allocate space of smart pointer first
for (int i = 0; i < size; ++i)
ar& data[i];
}
Примечание: Необходимо поставить макрос BOOST_SERIALIZATION_SPLIT_MEMBER (), поскольку функция сохранения / загрузки разделена.
Наконец, часть сериализации в классе А можно сделать следующим кодом:
friend class boost::serialization::access;
template<class Archive>
void save(Archive& ar, const unsigned int version) const
{
ar& size;
for (int i = 0; i < size; ++i)
ar& data[i];
}
template<class Archive>
void load(Archive& ar, const unsigned int version)
{
ar& size;
data = std::make_unique<int[]>(size);
for (int i = 0; i < size; ++i)
ar& data[i];
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
Ссылка: Учебник по сериализации Boost