提升序列化-来自多态档案

卡盘1

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

无论如何,我想要类似的东西

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

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

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

所以不,您不会(通常/必须)从实现中派生您将使用自己的方法实现接口1

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

适应为多态存档:

有一个广泛的类图,其中对层次结构中每个类的职责进行了散文描述。

同样,相关的位:

从类图和头文件中可以看出,此实现只是多态接口和标准模板驱动的实现的组合。这种组合是通过模板polymorphic_iarchive_route.hpp来完成的polymorphic_oarchive_route.hpp由于这些代码不包含特定于特定实现档案的特定代码,因此可以将它们用于从任何可运行的模板化存档实现创建多态档案实现

档案概念

存档的概念,从直接文档

存档概念指定了一个类必须实现的功能,才能用于序列化Serializable类型。该图书馆实施了一系列适合不同目的的档案。本节介绍如何实现它们以及实现自己的归档类的一种方法。我们的讨论将集中于用于加载的存档,因为层次结构与用于保存数据的存档完全相似。

为了最大程度地减少代码重复,我们的档案文件已放入一棵类树中。这在随附的类图中显示。满足以下要求的所有类都将充当加载档案。

最低要求

存档类派生自:

  template<class Archive>
  detail::common_iarchive;

此模板的一个实例处理与序列化关联的所有“簿记”。为了成为功能,必须声明以下附加功能:

  void load(T &t);

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

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

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

  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_archive接口不是必需的
  • 它通常会更有意义,以获得您的静态从现有的存档类型存档类型和适应 使用polymorphic_[io]archive_route类以上讨论

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章