Я использую библиотеку сериализации Cereal C++ (https://uscilab.github.io/cereal/index.html), чтобы сериализовать некоторые данные.
Типы данных, которые я пытаюсь сериализовать, в основном включают векторы векторов (например: vector<vector<ushort>>
) и базовые типы (например: uint, vector<string>
).
Когда я компилирую, я получаю следующую ошибку:
src/utils/cereal/types/common.hpp: In instantiation of ‘void cereal::serialize(Archive&, T*&) [with Archive = cereal::BinaryOutputArchive; T = Graph]’:
src/utils/cereal/cereal.hpp:408:39: required from ‘ArchiveType& cereal::OutputArchive<ArchiveType, Flags>::processImpl(const T&) [with T = Graph*; typename cereal::traits::detail::EnableIfHelper<cereal::traits::has_non_member_serialize<T, ArchiveType>::value, (! cereal::traits::has_invalid_output_versioning<T, ArchiveType>::value), (cereal::traits::is_output_serializable<T, ArchiveType>::value && (cereal::traits::is_specialized_non_member_serialize<T, ArchiveType>::value || (! cereal::traits::is_specialized<T, ArchiveType>::value)))>::type <anonymous> = (cereal::traits::detail::type)0; ArchiveType = cereal::BinaryOutputArchive; unsigned int Flags = 1u]’
src/utils/cereal/cereal.hpp:347:9: required from ‘void cereal::OutputArchive<ArchiveType, Flags>::process(T&&) [with T = Graph*; ArchiveType = cereal::BinaryOutputArchive; unsigned int Flags = 1u]’
src/utils/cereal/cereal.hpp:249:9: required from ‘ArchiveType& cereal::OutputArchive<ArchiveType, Flags>::operator()(Types&& ...) [with Types = {Graph*}; ArchiveType = cereal::BinaryOutputArchive; unsigned int Flags = 1u]’
src/Graph.cpp:169:22: required from here
src/utils/cereal/types/common.hpp:114:5: error: static assertion failed: Cereal does not support serializing raw pointers - please use a smart pointer
static_assert(cereal::traits::detail::delay_static_assert<T>::value,
Поиск в Google приводит меня на следующую страницу, касающуюся ошибки: https://uscilab.github.io/cereal/pointers.html
На этой странице предполагается, что причиной ошибки является либо сериализация "тупых" указателей, либо сериализация типа без конструктора по умолчанию.
Однако класс Graph
, который я сериализую, имеет конструктор по умолчанию Graph()
, и я не думаю, что я сериализую какие-то "глупые" указатели.
Соответствующий код класса Graph
:
Graph();
vector<vector<ushort>> adjacencyList();
vector<string> name();
unordered_map<string, ushort> unorderedNodeNameMap();
uint size;
friend class cereal::access;
template<class Archive>
void serialize(Archive& archive)
{
archive(CEREAL_NVP(adjacencyList), CEREAL_NVP(name), CEREAL_NVP(unorderedNodeNameMap), CEREAL_NVP(size);
}
Сериализация:
void Graph::serializeGraph()
{
ofstream ofs("b.out", ofstream::binary);
{
cereal::BinaryOutputArchive oArchive(ofs);
oArchive(this);
}
}