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

Vla*_*tov 13 c++ serialization boost

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

template <class Archive>
  void serialize( Archive& ar, unsigned version )
  {
     ar & m_Searcher;
  }
Run Code Online (Sandbox Code Playgroud)

......我想保持这么简单(我不想特别使用拆分).但在写作的情况下,我想m_Searcher在实际写作之前做一些"准备" .

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

  ar & m_Searcher;
}
Run Code Online (Sandbox Code Playgroud)

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

Fle*_*exo 26

我认为你可以不分裂这样做,这是通常的方式:

if (Archive::is_saving::value) 
   doSomething();
Run Code Online (Sandbox Code Playgroud)

这是继承自Archives使用的基本接口 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");
Run Code Online (Sandbox Code Playgroud)

我有点谨慎依赖这样的事情 - 如果有人编写了一个同时输入和输出的存档,多重继承可能会破坏它并且我不清楚这个界面的这个部分是如何永久和公开的是.