C++ 在同一程序中使用谷物和boost序列化
我们目前有一个使用大量boost序列化来存储数据的系统。我们希望从这一点转移到使用谷类食品 但是,我们不太可能完全迁移所有序列化对象。至少,我们必须能够反序列化旧版本的数据 是否可以同时使用boost和grane对同一对象进行序列化,最好不必编写两次序列化函数 我们的代码示例如下: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
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(子集)。与文本或二进制存档相比,您无法控制存档格式。麦片能让你控制吗?(在这种情况下,当然只需手工编写序列化代码,就可以利用该控件)