gpt4 book ai didi

c++ - Boost 以自定义方式序列化数据

转载 作者:行者123 更新时间:2023-11-28 04:36:13 28 4
gpt4 key购买 nike

假设我有一个存储在 map 某处的对象列表。我的目标是通过这样的 key 序列化所有共享指针:

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;
}

} }

然后在序列化过程中通过序列化的key,取回map中的对象。是否可以仅使用 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
}
}

这是正确的还是有其他更好的方法?

最佳答案

由于您是专门谈论某些 T,所以不要在 boost< 中提供过于通用的 serialize 模板 命名空间。

相反,利用 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

关于c++ - Boost 以自定义方式序列化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51364577/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com