提升序列化 - 多态存档 - 依赖于存档类型的行为

时间:2014-09-10 18:42:01

标签: c++ boost-serialization

我正在使用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 <<调用中的存档类型似乎发生了变化。有谁知道如何实现这个?

1 个答案:

答案 0 :(得分:1)

多态存档的全部意义在于,您无法预先了解将要使用的存档实现。实际上,它可能是一个尚未存在的归档类型,在动态加载的第三方库中实现:

  

多态存档的主要用途是允许建立类DLL,其中包括所有当前和未来存档的序列化代码,没有冗余代码。docs

一旦你开始对特定的档案类型进行特殊处理,你至少会在上游游泳,并可能会遇到麻烦。

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

  • 你会如何处理未知类型?
  • 你会如何处理从xml_archive继承的类型? (实际上没有办法在运行时检测到这一点)
  • 您将如何处理聚合此类xml_archive的类型? (甚至没有办法在编译时检测到这一点,更不用说在运行时了)

简而言之,如果您有特殊处理,请将其编纂。只需实施saveXml函数或saveAs(SaveOptions format)即可。您可以使用多态存档来实现两者中的一个,并通过引用获取xml_oarchive&(因此您可以接受派生的实现)。

$ 0.02