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

How can I remove this duplicate code when using Boost serialization?

本文关键字:删除 代码 序列化 Boost      更新时间:2023-10-16

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

    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序列化功能时,类没有必须实现的超类型。

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

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

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

std:String str = serializeObject(ObjectToSerialize);

这很简单:您不想要也不需要这些对象的基类。因此,使用静态多态性代替动态多态性:

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