C++ boost序列化-多态存档-存档类型相关行为

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

我正在使用boost serialization(V1.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);
}

因此,
ar中的归档类型似乎发生了变化多态归档的全部意义在于,您无法预先知道将使用什么归档实现。事实上,它可能是一种尚未存在的归档类型,在动态加载的第三方库中实现:

多态存档的主要用途是允许构建类DLL,该类DLL将包括所有当前和未来存档的序列化代码,而不包含冗余代码。()

一旦您开始对特定的归档类型进行特殊处理,您至少会逆流而上,可能会自找麻烦

我建议您重新考虑在运行时检测归档实现的感知需求。即使有办法在运行时获取实现类型的RTTI
typeid

  • 您将如何处理未知类型
  • 您将如何处理从(比如)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