C++ Serialization with Cereal error: Cereal does not support serializing raw pointers
C++ Serialization with Cereal error: Cereal does not support serializing raw pointers
我正在使用 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,
A Google 搜索将我带到以下有关错误的页面:https://uscilab.github.io/cereal/pointers.html
此页面表明错误的原因要么是序列化 "dumb" 指针,要么是序列化没有默认构造函数的类型。
但是,我正在序列化的 Graph
class 有一个默认构造函数 Graph()
,我不认为我正在序列化任何 "dumb" 指针。
相关Graph
class代码:
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);
}
}
忘记了this
是指针类型。我想除了不能直接序列化 "dumb" 指针之外,你也不能将它们传递给输出存档。
将序列化对象作为值传递解决了它:
void Graph::serializeGraph(Graph a)
{
ofstream ofs("b.out", ofstream::binary);
{
cereal::BinaryOutputArchive oArchive(ofs);
oArchive(a);
}
}
我正在使用 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,
A Google 搜索将我带到以下有关错误的页面:https://uscilab.github.io/cereal/pointers.html
此页面表明错误的原因要么是序列化 "dumb" 指针,要么是序列化没有默认构造函数的类型。
但是,我正在序列化的 Graph
class 有一个默认构造函数 Graph()
,我不认为我正在序列化任何 "dumb" 指针。
相关Graph
class代码:
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);
}
}
忘记了this
是指针类型。我想除了不能直接序列化 "dumb" 指针之外,你也不能将它们传递给输出存档。
将序列化对象作为值传递解决了它:
void Graph::serializeGraph(Graph a)
{
ofstream ofs("b.out", ofstream::binary);
{
cereal::BinaryOutputArchive oArchive(ofs);
oArchive(a);
}
}