boost序列化中如何区分读/写操作?

Posted

技术标签:

【中文标题】boost序列化中如何区分读/写操作?【英文标题】:How to distinguish read / write operation in boost serialization? 【发布时间】:2011-04-09 18:36:36 【问题描述】:

使用 boost 序列化库,我有一个非常简单的serialize() 成员函数,类似于:

template <class Archive>
  void serialize( Archive& ar, unsigned version )
  
     ar & m_Searcher;
  

... 我想让它保持简单(我不想特别使用拆分)。但在写作的情况下,我想在实际写作之前为m_Searcher 做一些“准备”。


  if( this-is-a-writing-operation )
     do-some-preparation( m_Searcher )

  ar & m_Searcher;

有没有简单的方法来区分读写操作?

【问题讨论】:

如果您不介意将逻辑拆分为两个函数,请查看boost.org/doc/libs/1_47_0/libs/serialization/doc/… 【参考方案1】:

我认为您可以在不拆分的情况下执行此操作,这将是通常的方式:

if (Archive::is_saving::value) 
   doSomething();

这是从档案使用的基本接口继承而来的,在boost/archive/detail/interface_[ia]archive.hpp

以下代码演示了它似乎是 1.42 的合理解决方案

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>

// oarchive:
//text
static_assert(!boost::archive::text_oarchive::is_loading::value, "out is loading");
static_assert(boost::archive::text_oarchive::is_saving::value, "out isn't saving");

//xml
static_assert(!boost::archive::xml_oarchive::is_loading::value, "out is loading");
static_assert(boost::archive::xml_oarchive::is_saving::value, "out isn't saving");

// iarchive:
//text
static_assert(boost::archive::text_iarchive::is_loading::value, "out is loading");
static_assert(!boost::archive::text_iarchive::is_saving::value, "out isn't saving");

//xml
static_assert(boost::archive::xml_iarchive::is_loading::value, "out is loading");
static_assert(!boost::archive::xml_iarchive::is_saving::value, "out isn't saving");

不过,我对依赖这样的东西会有点谨慎——如果有人编写了一个既能输入又能输出的存档,多重继承可能会破坏它并且我不清楚它的持久性如何并且公开这部分界面的本意。

【讨论】:

作为针对上述可能存在的双向存档问题的某种保护检查,可以添加static_assert(Archive::is_saving::value != Archive::is_loading::value);

以上是关于boost序列化中如何区分读/写操作?的主要内容,如果未能解决你的问题,请参考以下文章

python文件读取操作序列化

如何在 boost 序列化中更改或删除标签?

如何使用boost序列化?

如何使用 boost std::vector of boost::unordered_map 进行序列化/反序列化

如何使用boost序列化进行二进制输出?

多个流,简短的读和写