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;

この 2 番目のコード ブロックは、オブジェクトをシリアル化するたびに使用する必要があるため、私を悩ませています。このコードを 1 つの場所に移動して、オブジェクトをシリアル化する必要があるときに呼び出す方法はありますか?

このメソッドを使用してオブジェクトを作成できます。

    string serializeObject(Serializable obj)

しかし、これの問題は、ブースト シリアライゼーション機能を追加するときにクラスが実装する必要があるスーパータイプがないため、どのオブジェクトが「シリアライズ可能」であるかを判断する方法がないことです。

では、このコードを 1 か所にまとめて、シリアライズ可能なオブジェクトのみをメソッドに渡すにはどうすればよいでしょうか?

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 に答える