c++ - 在同一个程序中使用 cereal 和 boost 序列化

标签 c++ boost cereal

我们目前有一个系统使用很多 boost 序列化来存储数据。我们希望摆脱这种情况,转而使用 Cereal 。

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

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

我们的代码示例是:

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

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

最佳答案

我会冒险说"is"。

这些库具有相似性,但如果它们不共存,则在其中一个或两个库中都会出现 BUG。

您没有显示任何代码,因此我们对您如何组织序列化代码一无所知。

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

最重要的是要认识到实际的序列化代码只需要在序列化发生的地方可见。如果您将其限制为 TU 并将其中涉及的所有函数设为静态文件,那么您将免受鲨鱼威胁¹。

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

chalice :统一序列化函数

这显然需要更多的工作,但似乎可以通过少量的元编程来实现。快速看一下,从现有的 Cerial 序列化函数中实现 Boost 可序列化似乎更容易,但我想这很不幸。


¹ 鲨鱼喜欢模棱两可的过载或违反 ODR

²/ɪnˈtruːsɪv/形容词 1. 造成破坏或烦恼...

关于c++ - 在同一个程序中使用 cereal 和 boost 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46173488/

相关文章:

c++ - 多重继承的麻烦

c++ - 为什么不能直接计算一个范围内的枚举类成员而可以直接计算一个范围内的枚举?

c++ - VS 2017 Community 出现链接器错误,但 Professional 没有

c++ - 如何抑制由 Boost.Log 和 GCC 4.4 引起的 "warning: missing initializer"?

从 Boost object_pool 构造的指针的 C++ Boost 二进制序列化

c++ - 在 fixed_sized<true> 的情况下 boost 无锁队列行为

c++ - cURL 处理大型 JSON 响应

CEREAL 无法序列化 - 无法从输入流异常中读取

c++ - 使用 Cereal 反序列化 JSON 字符串

c++ - 有没有办法使用 Cereal/C++ 为 std::map 指定更简单的 JSON(反)序列化?