如何通过 getter 函数序列化包含指针的类?
Posted
技术标签:
【中文标题】如何通过 getter 函数序列化包含指针的类?【英文标题】:How do I serialize a class containing pointer via a getter function? 【发布时间】:2013-09-29 12:43:53 【问题描述】:假设我有一个类A
,其中包含一个私有成员B const * p
,它可以通过公共函数B const& A::get()
访问。如何序列化函数 A 使用 boost save_construct_data
和 load_construct_data
函数?
这是我包含的尝试(请注意,此示例说明了问题本身,而不是我使用此 get
函数的原因):
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <fstream>
class B
public:
int a;
//////////////////////////////////
// Boost Serialization:
//
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar,const unsigned int file_version)
ar & a;
;
class A
public:
A(B const * p) : p(p)
B const& get() const return *p;
private:
B const * p;
void A::Save(char * const filename);
static A * const Load(char * const filename);
//////////////////////////////////
// Boost Serialization:
//
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar,const unsigned int file_version)
;
namespace boost
namespace serialization
template<class Archive>
inline void save_construct_data(
Archive & ar, A const * t, unsigned const int file_version
)
ar << &t->get();
template<class Archive>
inline void load_construct_data(
Archive & ar, A * t, const unsigned int file_version
)
B const * p;
ar >> p;
::new(t) A(p);
// save the world to a file:
void A::Save(char * const filename)
// create and open a character archive for output
std::ofstream ofs(filename);
// save data to archive
boost::archive::text_oarchive oa(ofs);
// write the pointer to file
oa << this;
// load world from file
A * const A::Load(char * const filename)
A * a;
// create and open an archive for input
std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
// read class pointer from archive
ia >> a;
return a;
int main()
错误是:error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const B *' (or there is no acceptable conversion)
【问题讨论】:
【参考方案1】:你不能序列化一个临时的(AFAICT 是 Boost 限制)。
B const * p = &t->get();
ar << p;
【讨论】:
以上是关于如何通过 getter 函数序列化包含指针的类?的主要内容,如果未能解决你的问题,请参考以下文章
2020.5.4 从前序与中序遍历序列构造二叉树 中等 105