2

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

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

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

4

2 回答 2

3

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

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


std:String str = serializeObject(ObjectToSerialize);
于 2013-02-21T14:31:15.463 回答
1

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

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

于 2013-02-21T14:35:46.610 回答