1. ホーム
  2. c++

[解決済み] C++でオブジェクトをシリアライズするには?

2023-01-12 03:34:17

質問

オブジェクトの小さな階層があり、それをシリアライズしてソケット接続で送信する必要があります。 私は、オブジェクトをシリアライズし、それがどのような型であるかに基づいてそれをデシリアライズする必要があります。 C++ でこれを行う簡単な方法はありますか (Java にあるように)。

C++のシリアライゼーションオンラインコードサンプルやチュートリアルはありますか?

EDITです。 ちょうど明確にするために、私はオブジェクトをバイトの配列に変換し、オブジェクトに戻すためのメソッドを探しています。 私はソケット送信を処理することができます。

どのように解決するのですか?

シリアライズの話をすると ブーストシリアライゼーションAPI が思い浮かびます。シリアライズされたデータをネット上で転送する方法としては、Berkeleyソケットか asioライブラリ .

編集してください。

オブジェクトをバイト配列にシリアライズする場合は、以下の方法でboostシリアライザを使用します(チュートリアルサイトより抜粋)。

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
class gps_position
{
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & degrees;
        ar & minutes;
        ar & seconds;
    }
    int degrees;
    int minutes;
    float seconds;

public:
    gps_position(){};
    gps_position(int d, int m, float s) :
    degrees(d), minutes(m), seconds(s)
    {}
};

実際のシリアライズは、その後、非常に簡単です。

#include <fstream>
std::ofstream ofs("filename.dat", std::ios::binary);

    // create class instance
    const gps_position g(35, 59, 24.567f);

    // save data to archive
    {
        boost::archive::binary_oarchive oa(ofs);
        // write class instance to archive
        oa << g;
        // archive and stream closed when destructors are called
    }

デシリアライズは同様の方法で動作します。

ポインタのシリアライズ(トレスなどの複雑なデータ構造も問題ありません)、派生クラスのシリアライズ、バイナリやテキストのシリアライズを選択できるメカニズムも用意されています。さらに、すべてのSTLコンテナが箱から出してサポートされています。