C++ boost序列化-多态存档-存档类型相关行为
我正在使用boost serialization(V1.55),我正在尝试为依赖于存档类型(xml或二进制)的C++ boost序列化-多态存档-存档类型相关行为,c++,boost-serialization,C++,Boost Serialization,我正在使用boost serialization(V1.55),我正在尝试为依赖于存档类型(xml或二进制)的foo实现序列化行为。同时,我需要使用多态存档类型。下面是一个简单的示例: #include <sstream> #include <boost/archive/polymorphic_binary_iarchive.hpp> #include <boost/archive/polymorphic_binary_oarchive.hpp> #incl
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);
}
因此,
ar中的归档类型似乎发生了变化多态归档的全部意义在于,您无法预先知道将使用什么归档实现。事实上,它可能是一种尚未存在的归档类型,在动态加载的第三方库中实现:
多态存档的主要用途是允许构建类DLL,该类DLL将包括所有当前和未来存档的序列化代码,而不包含冗余代码。()
一旦您开始对特定的归档类型进行特殊处理,您至少会逆流而上,可能会自找麻烦
我建议您重新考虑在运行时检测归档实现的感知需求。即使有办法在运行时获取实现类型的RTTItypeid
- 您将如何处理未知类型
- 您将如何处理从(比如)xml_归档文件继承的类型?(在运行时确实无法检测到这一点)
- 您将如何处理聚合此类xml_归档的类型?(甚至没有在编译时检测这种情况的方法,更不用说在运行时了)
简言之,如果您有特殊处理,请对其进行编码。只需实现一个saveXml
函数或saveAs(SaveOptions格式)
。您可以使用多态存档实现这两种格式中的一种,并通过引用获取xml\u-oarchive&
(因此您可以很好地接受派生实现)
$0.02
error: no matching function for call to ‘foo::save(boost::archive::polymorphic_oarchive&, const unsigned int&) const