我正在使用boost序列化(v 1.55,我正在尝试实现依赖于归档类型(xml或二进制)的foo
的序列化行为。同时,我需要使用多态存档类型。这是一个简单的例子:
#include <sstream>
#include <boost/archive/polymorphic_binary_iarchive.hpp>
#include <boost/archive/polymorphic_binary_oarchive.hpp>
#include <boost/archive/polymorphic_xml_iarchive.hpp>
#include <boost/archive/polymorphic_xml_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
using namespace boost::archive;
typedef polymorphic_binary_iarchive BI;
typedef polymorphic_binary_oarchive BO;
typedef polymorphic_xml_iarchive XI;
typedef polymorphic_xml_oarchive XO;
/*
typedef binary_iarchive BI;
typedef binary_oarchive BO;
typedef xml_iarchive XI;
typedef xml_oarchive XO;
*/
struct foo
{
void save(BO & ar, unsigned int const & version) const {}
void load(BI & ar, unsigned int const & version) {}
void save(XO & ar, unsigned int const & version) const {}
void load(XI & ar, unsigned int const & version) {}
BOOST_SERIALIZATION_SPLIT_MEMBER();
};
int main()
{
std::stringstream ss;
XO ar(ss);
foo f;
ar << BOOST_SERIALIZATION_NVP(f);
}
如果我使用非多态存档类型,代码会编译,但是对于多态类型,我会收到以下错误
error: no matching function for call to ‘foo::save(boost::archive::polymorphic_oarchive&, const unsigned int&) const
因此,ar <<
调用中的存档类型似乎发生了变化。有谁知道如何实现这个?
答案 0 :(得分:1)
多态存档的全部意义在于,您无法预先了解将要使用的存档实现。实际上,它可能是一个尚未存在的归档类型,在动态加载的第三方库中实现:
多态存档的主要用途是允许建立类DLL,其中包括所有当前和未来存档的序列化代码,没有冗余代码。(docs)
一旦你开始对特定的档案类型进行特殊处理,你至少会在上游游泳,并可能会遇到麻烦。
我建议你重新考虑在运行时检测归档实现的感知需求。即使有办法在运行时获取实现类型的RTTI typeid
,
简而言之,如果您有特殊处理,请将其编纂。只需实施saveXml
函数或saveAs(SaveOptions format)
即可。您可以使用多态存档来实现两者中的一个,并通过引用获取xml_oarchive&
(因此您可以接受派生的实现)。
$ 0.02