如何创建一个派生自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归档的示例,但没有使用多态归档类型。我不知道从哪个类派生以及使用哪些成员函数签名。
答案 0 :(得分:1)
实际上,polymorphic_archive
的整个想法是实现该接口(因此客户端不必在编译时了解特定(未来)实现)。
所以不,你不会(通常/必然)从实现派生。您可以使用自己的方法 1 实现接口。
因此,假设您已经存在某种(非多态)归档实现。如果这恰好是满足Boost Serialization存档概念要求的存档实现,则可以使用boost中的现成适配器。
有一个广泛的 class diagram ,其中有关于层次结构中每个类的职责的散文说明。
再次,相关位:
从类图和头文件中可以看出,这个实现只是多态接口和标准模板驱动实现的组合。此合成由模板
polymorphic_iarchive_route.hpp
和polymorphic_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 当然,可能有理由从现有档案中推导出档案的实施,但