gpt4 book ai didi

c++ - 提升序列化 - 多态文件 - 文件类型相关行为

转载 作者:行者123 更新时间:2023-11-28 06:42:15 25 4
gpt4 key购买 nike

我正在使用 boost 序列化(v 1.55,我正在尝试为 foo 实现序列化行为,这取决于归档类型(xml 或二进制)。同时,我需要使用多态归档类型. 这是一个简单的例子:

#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 << 中的存档类型发生了变化称呼。有谁知道如何实现这个?

最佳答案

多态存档的全部要点是您无法预先知道将使用什么存档实现。事实上,它可能是一种尚不存在的存档类型,在动态加载的第 3 方库中实现:

The main utility of polymorphic archives will be to permit the buiding of class DLLs that will include serialization code for all present and future archives with no redundant code. (docs)

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

我建议您重新考虑在运行时检测存档实现的必要性。即使有办法在运行时获取实现类型的 RTTI typeid

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

总之,如果你有特殊处理,就把它编码。只需实现一个 saveXml 函数或 saveAs(SaveOptions format)。您可以使用多态存档来实现两者之一,并通过引用获取 xml_oarchive&(这样您就可以很好地接受派生实现)。

0.02 美元

关于c++ - 提升序列化 - 多态文件 - 文件类型相关行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25772756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com