我们目前有一个系统使用很多 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/