Сериализация С++ с ошибкой Cereal: Cereal не поддерживает сериализацию необработанных указателей

Я использую библиотеку сериализации 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);
    }
}

person Sleepless    schedule 28.02.2018    source источник


Ответы (1)


Я забыл, что this - это тип указателя. Я думаю, помимо невозможности напрямую сериализовать «тупые» указатели, вы также не можете передать их в выходной архив.

Передача объекта сериализации в качестве значения решила эту проблему:

void Graph::serializeGraph(Graph a)
{
    ofstream ofs("b.out", ofstream::binary);
    {
        cereal::BinaryOutputArchive oArchive(ofs);
        oArchive(a);
    }
}
person Sleepless    schedule 28.02.2018