使用Boost序列化时如何删除此重复代码?

时间:2013-02-21 14:26:52

标签: c++ serialization boost boost-serialization

在我的应用程序中,我有许多我希望能够序列化的类。因此,其实例需要可序列化的每个类具有以下内容:

    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version)
    {
       // ar & (all data members) 
    }

要序列化对象,我需要在课外使用此代码:

    ObjectToSerialize obj;
    stringstream ss;
    boost::archive::text_oarchive oa(ss);
    oa << obj;

这第二段代码让我烦恼,因为我每次想要序列化一个对象时都要使用它。有什么办法可以将这段代码移动到一个位置,并在需要序列化对象时调用它吗?

我可以使用此方法获得一个对象:

    string serializeObject(Serializable obj)

但问题是没有办法确定哪些对象是“可序列化的”,因为在添加boost序列化功能时,类没有超类型。

那么如何将这些代码放在一个地方并且只允许可序列化的对象传递给方法?

2 个答案:

答案 0 :(得分:3)

创建一个模板函数,该函数接受具有序列化函数的对象。

template <typename T> std::string serializeObject(T obj) {
    stringstream ss;
    boost::archive::text_oarchive oa(ss);
    oa << obj;
    //...
}


std:String str = serializeObject(ObjectToSerialize);

答案 1 :(得分:1)

这很简单:你不需要并且需要这些对象的基类。因此,使用 static 多态性代替动态多态:

template <class Serializable>
std::string serializeObject(Serializable& s)
{
  stringstream ss;
  boost::archive::text_oarchive oa(ss);
  oa << obj;
  return ss.str();
}

现在,如果将某些内容传递给不可序列化的函数,则会出现编译器错误。为了使错误更具可读性,您可以尝试使用一些基于SFINAE的技术,如std::enable_if