假设我有一些对象列表存储在地图中的某处。我的目标是通过这样的键序列化所有共享指针:
namespace boost { namespace serialization {
template<class Archive, class T>
inline void serialize(Archive& ar, boost::shared_ptr<T>& b, const unsigned int file_version)
{
std::string key_of_b = // get a key of object b;
ar << key_of_b;
}
} }
然后,在通过序列化的键进行序列化的过程中,取回映射中的对象。是否可以仅使用boost :: shared_ptr对对象进行序列化/反序列化?喜欢:
int main() {
std::stringstream ss;
// serialize
boost::shared_ptr<int> p{new int{1123}};
boost::archive::text_oarchive oa(ss);
oa << p1;
// deserialize
boost::archive::text_iarchive ia(ss);
boost::shared_ptr<int> p_i{new int{1123}};
ia >> p_i;
return 0;
}
我知道代码无法以这种方式工作。我想用serialize
方法处理序列化/反序列化:
template<class Archive, class T>
inline void serialize(Archive& ar, boost::shared_ptr<T>& b, const unsigned int file_version)
{
if (boost::archive::text_oarchive::is_saving::value) {
std::string key_of_b = // get a key of object b;
ar << key_of_b;
} else {
std::string key;
ar >> key;
// get the T
}
}
那是正确的还是还有另一种更好的方法?
答案 0 :(得分:1)
由于您是专门讨论某些 T
,因此请不要在serialize
名称空间内提供过于通用的boost
模板。
相反,利用ADL
并将其放入您的自定义类型:
namespace MyLib {
struct MyType { /*....*/ };
template<class Archive>
void save(Archive& ar, boost::shared_ptr<MyType> const& p, unsigned)
{
...
}
template<class Archive>
void load(Archive& ar, boost::shared_ptr<MyType>& p, unsigned)
{
...
}
template<class Archive> inline void serialize(Archive& ar, boost::shared_ptr<MyType>& p, unsigned file_version) {
split_free(ar, p, file_version);
}
} // namespace MyLib
关于split_free
参见documentation