在同一个程序中使用谷物和提升序列化

时间:2017-09-12 10:01:42

标签: c++ boost cereal

我们目前有一个系统使用boost序列化的 lot 来存储数据。我们正在寻求远离这一目标,转而使用谷物。

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

是否可以同时使用boost和grain来序列化同一个对象,最好不必编写两次序列化函数?

我们的代码示例是:

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);
}

我认为我们没有比这更复杂的事情。

1 个答案:

答案 0 :(得分:0)

我会站出来说“是”。

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

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

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

要实现的最重要的事情是实际的序列化代码只需要在序列化发生时可见。如果你把它限制在TU并使其中涉及的所有函数都是静态的,你就可以安全地使用鲨鱼¹。

显然,如果序列化代码是非侵入性的,那么你会更好。但即使你这样做,只需使用侵入式方法中继来释放可以是文件静态的函数。

圣杯:统一序列化功能

显然,这需要更多的工作,但似乎可以通过一些元编程来完成。从快速查看看起来,从现有的Cerial序列化函数实现Boost可序列化更容易,但我想这很难运气。

¹像暧昧的超载或ODR违规

²/ɪntruːsv/形容词1.导致中断或烦恼......