提升序列化 - 源自多态存档

时间:2014-09-11 20:56:37

标签: c++ boost boost-serialization

如何创建一个派生自boost::archive::polymorphic_xml_oarchive的类?我假设这是多态存档的全部目的?也许我错了。

无论如何,我想要像

这样的东西
class MyArchive: public boost::serialization::polymorphic_xml_oarchive
{
    public:
        // custom behavior for select types
        void save(int const & t){}
};

我找到了创建自定义boost归档的示例,但没有使用多态归档类型。我不知道从哪个类派生以及使用哪些成员函数签名。

1 个答案:

答案 0 :(得分:1)

实际上,polymorphic_archive的整个想法是实现该接口(因此客户端不必在编译时了解特定(未来)实现)。

所以不,你不会(通常/必然)从实现派生。您可以使用自己的方法 1 实现接口。

因此,假设您已经存在某种(非多态)归档实现。如果这恰好是满足Boost Serialization存档概念要求的存档实现,则可以使用boost中的现成适配器。

适应多态存档:

有一个广泛的 class diagram ,其中有关于层次结构中每个类的职责的散文说明。

再次,相关位:

  

从类图和头文件中可以看出,这个实现只是多态接口和标准模板驱动实现的组合。此合成由模板polymorphic_iarchive_route.hpppolymorphic_oarchive_route.hpp完成。由于这些代码不包含特定于特定实现归档的代码,因此可以用于从任何正常运行的模板化归档实现创建多态归档实现

档案概念

档案概念,直接来自 documentation

  

Archive概念指定了类必须实现的功能   用于序列化Serializable类型。该库实现了一个   适合不同目的的档案馆。本节介绍   它们是如何实现的,并且可以通过一种方式实现自己的存档   类。我们的讨论将集中在用于加载的档案   层次结构与用于保存数据的存档完全相似。

     

我们的档案已被考虑到一组课程中,以便最小化    重复代码。这显示在随附的类图中。任何    满足以下要求的类将用作加载    存档。

     

最低要求

     

归档类派生自:

  template<class Archive>
  detail::common_iarchive;
     

此模板的一个实例处理所有&#34;簿记&#34;相关   与序列化。为了成为一个功能只有以下附加   必须声明函数:

  void load(T &t);
     

必须为所有原始数据类型实现此功能。这可以    通过使用成员模板或显式声明来完成    适用于所有原始类型。

  void load_binary(void *address, std::size_t size);
     

此函数应从存档中调整字节大小,并将其从地址地址开始复制到内存中。

  friend class boost::archive::load_access;
     

此外,这样的类必须提供以下朋友声明    授予对核心序列化库的访问权限    类。

     

因此,输入存档的最简单的实现将如下所示:

#include <boost/archive/detail/common_iarchive.hpp>

/////////////////////////////////////////////////////////////////////////
// class trivial_iarchive - read serialized objects from a input text stream
class trivial_iarchive : 
    public boost::archive::detail::common_iarchive<trivial_iarchive>
{
    // permit serialization system privileged access to permit
    // implementation of inline templates for maximum speed.
    friend class boost::archive::load_access;

    // member template for loading primitive types.
    // Override for any types/templates that special treatment
    template<class T>
    void load(T & t);

public:
    //////////////////////////////////////////////////////////
    // public interface used by programs that use the
    // serialization library

    // archives are expected to support this function
    void load_binary(void *address, std::size_t count);
};

1 当然,可能有理由从现有档案中推导出档案的实施,但

  • 这将是一个实现细节,它不是提供polymorphic_ [io]存档接口所必需的
  • 使用{{1}从现有存档类型中获取静态存档类型和适应 通常更有意义上面讨论的类