2

我们目前有一个使用大量boost序列化来存储数据的系统。我们正在寻求摆脱这种情况,转而使用谷物。

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

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

我们的代码示例是:

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

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

4

1 回答 1

0

我会拼命说“是”。

这些库有相似之处,但如果它们不共存,那将是一个或两个库中的 BUG。

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

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

要意识到的最重要的事情是实际的序列化代码只需要在序列化发生的地方可见。如果您将其限制为 TU 并将其中涉及的所有功能设为文件静态,您将不会受到鲨鱼的伤害¹。

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

圣杯:统一序列化函数

显然,这需要更多的工作,但通过少量的元编程似乎是可行的。乍一看,从现有的 Cerial 序列化函数中实现 Boost-serializability 似乎更容易,但我想这很不走运。


¹ 鲨鱼喜欢模棱两可的超载或 ODR 违规

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

于 2017-09-12T13:17:15.437 回答