以自定义方式提升序列化数据
Posted
技术标签:
【中文标题】以自定义方式提升序列化数据【英文标题】:Boost Serialize data in a custom way 【发布时间】:2018-07-16 14:50:45 【问题描述】:假设我有一个存储在 map 某处的对象列表。我的目标是通过这样的键序列化所有共享指针:
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> pnew int1123;
boost::archive::text_oarchive oa(ss);
oa << p1;
// deserialize
boost::archive::text_iarchive ia(ss);
boost::shared_ptr<int> p_inew int1123;
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
这是正确的还是有其他更好的方法?
【问题讨论】:
【参考方案1】:由于您具体讨论的是某些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
【讨论】:
对不起我的错误。我可以有很多 T,但我不能为每个 T 使用序列化方法。 不过,像这样使用 ADL 可以避免冲突。您可以打开模板,但将其保留在声明的命名空间中。另外,我认为您需要重新考虑您的序列化方法。在我看来,您正在特别对待共享指针。 T 可能是fly-weight objects?在这种情况下,请考虑明确表达“享元”模式(而不是“匿名”shared_ptr 用法),以便将语义附加到该类型。 这显然是一个猜测,所以在你指出猜测(显然)不准确之前,概括一下:我建议的概念转变是在自定义类型中编码语义。 (你仍然可以在里面使用shared_ptr
)。作为中间立场,您可以使用serialization wrappers
Ts 不能是飞重对象。无论如何,感谢您的帮助。您的解决方案解决了问题。以上是关于以自定义方式提升序列化数据的主要内容,如果未能解决你的问题,请参考以下文章
在 Boost Property 树库中,我如何以自定义方式处理文件未找到错误(C++)