使用 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;
}
有没有简单的方法来区分读写操作?
最佳答案
我认为您可以在不拆分的情况下执行此操作,这将是通常的方式:
if (Archive::is_saving::value)
doSomething();
这是从文件使用的基本接口(interface)继承而来的,在 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");
不过,我对依赖这样的东西会有点谨慎——如果有人编写了一个既能输入又能输出的文件,多重继承可能会破坏它并且我不清楚它的持久性如何并且公开这部分界面的本意。
关于c++ - boost序列化中如何区分读/写操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3668586/