Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在同一程序中使用谷物和boost序列化_C++_Boost_Cereal - Fatal编程技术网

C++ 在同一程序中使用谷物和boost序列化

C++ 在同一程序中使用谷物和boost序列化,c++,boost,cereal,C++,Boost,Cereal,我们目前有一个使用大量boost序列化来存储数据的系统。我们希望从这一点转移到使用谷类食品 但是,我们不太可能完全迁移所有序列化对象。至少,我们必须能够反序列化旧版本的数据 是否可以同时使用boost和grane对同一对象进行序列化,最好不必编写两次序列化函数 我们的代码示例如下: class Base { public: std::string m_VarA; std::string m_VarB template<class Archive> v

我们目前有一个使用大量boost序列化来存储数据的系统。我们希望从这一点转移到使用谷类食品

但是,我们不太可能完全迁移所有序列化对象。至少,我们必须能够反序列化旧版本的数据

是否可以同时使用boost和grane对同一对象进行序列化,最好不必编写两次序列化函数

我们的代码示例如下:

class Base
{
public:
    std::string m_VarA;
    std::string m_VarB

    template<class Archive>
    void serialize(Archive & rArchive, const unsigned int nVersion)
    {
        rArchive & BOOST_SERIALIZATION_NVP(m_VarA);
        rArchive & BOOST_SERIALIZATION_NVP(m_VarB);
    }
};

class Derived : public Base
{
friend class boost::serialization::access;
public:
    std::bitset<32> m_Flags;
    template<class Archive>
    void serialize(Archive & rArchive, const unsigned int nVersion)
    {
        rArchive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base); 
        rArchive & BOOST_SERIALIZATION_NVP(m_Flags);        
    }    
};

std::ostringstream stream;
Derived var;
{
    boost::archive::xml_oarchive rArchive(stream);
    rArchive & boost::serialization::make_nvp("Configuration", var);
}
类基
{
公众:
std::字符串m_VarA;
std::string m_VarB
模板
无效序列化(存档和稀疏、常量无符号整数转换)
{
rArchive&BOOST_-NVP(m_-VarA);
rArchive&BOOST_序列化_NVP(m_VarB);
}
};
派生类:公共基
{
好友类boost::serialization::access;
公众:
std::位集m_标志;
模板
无效序列化(存档和稀疏、常量无符号整数转换)
{
rArchive和BOOST_序列化_BASE_OBJECT_NVP(BASE);
rArchive和BOOST_序列化_NVP(m_标志);
}    
};
std::奥斯汀溪流;
衍生风险价值;
{
boost::archive::xml_-oarchive-rArchive(流);
rArchive&boost::序列化::生成nvp(“配置”,var);
}

我想我们没有比这更复杂的了。

我会冒险说“是的”

这两个库有相似之处,但如果它们不共存,那么这两个库中的任何一个或两个都会出现BUG

您没有显示任何代码,因此我们不知道您是如何组织序列化代码的

对于任何方法,我都可以设想迁移路径

要认识到的最重要的一点是,实际的序列化代码只需要在序列化发生时才可见。如果您将其限制为TU,并将其中涉及的所有函数都设置为静态文件,那么您将不会受到sharks的攻击

显然,如果序列化代码是非侵入性的,您的情况会更好。但是,即使您这样做了,也只需将侵入性方法中继到可以是文件静态的自由函数

圣杯:统一序列化函数 显然,这需要做更多的工作,但通过少量的元编程似乎是可行的。快速看一看,从现有的Cerial序列化函数实现Boost序列化似乎更容易,但我想这很难实现


imk_Shark喜欢含糊不清的重载或ODR冲突


²/ɪnˈtruːsɪv/形容词1。造成干扰或烦恼…

我希望不会有任何明显的问题。我已经添加了一个代码示例,所以您可以大致了解我们是如何做到这一点的。哦,这引入了相当多的角落和缝隙。NVP、基类等。如果我是你,我会简单地写下谷类风格的序列化。很快就会清楚哪些部分可以自动化。如果您想完全覆盖每个基础,您可以欺骗并实现一个自定义的归档类型,将其转发给Google。这可能不符合要求,但再一次,没有人告诉我为什么我要改吃谷类食品,所以也许它符合要求。你决定吧。我们放弃boost的主要原因,除了谷物更闪亮之外,是它的XML序列化非常微妙。有时,我们必须直接编辑XML,大多数XML工具倾向于生成boost无法处理的有效XML。boost没有XML库,XML存档后端仅使用XML(子集)。与文本或二进制存档相比,您无法控制存档格式。麦片能让你控制吗?(在这种情况下,当然只需手工编写序列化代码,就可以利用该控件)