2

複雑なネストされた構造を取得して、静的データとして.cppファイルに直接保存しようとしています。私が採用したいアプローチは、オブジェクト(Boostシリアル化をすでにサポートしている)を取得し、それをバイナリアーカイブとしてバイト配列にシリアル化することです。次に、そのバイト配列を取得し、それをウォークスルーして、バイナリ配列を保持するために必要な.cppコードを自動生成することができます。次に、そのバイト配列からオブジェクトに逆シリアル化します。

だから基本的に、一日の終わりに私はこのようなものが欲しいです:

unsigned char* my_obj = { 10, 48, 48, 30, 20 ... }

そのデータを使用したい場合は、「バイトストリーム」でラップし、Boostに再度渡して、実際のオブジェクトに逆シリアル化します。

私の質問は、バイト配列をストリームとして渡す簡単な方法はありますか?Boostは、アーカイブの読み取りと書き込みのためのistreamとostreamを扱います。文字列ストリームやファイルストリームは使用したくありませんが、渡されるものすべてに対して巨大なバイト配列として機能するカスタムストリームである可能性があります。

このカスタムストリームを作成し、Boostシリアル化とシームレスに連携させるための優れた方法があるはずだと思います...どこから始めればよいのかよくわかりません。

4

1 に答える 1

6

unsigned char * my_obj = {10、48、48、30、20 ...}

使用することをお勧めします:

unsigned char my_obj[] = { 10, 48, 48, 30, 20 ... }

したがって、開始するポインタだけでなく、サイズを認識している配列が作成されます。また、変更する予定がない場合は、constを追加します。


私の質問は、バイト配列をストリームとして渡す簡単な方法はありますか?Boostは、アーカイブの読み取りと書き込みのためのistreamとostreamを扱います。文字列ストリームやファイルストリームは使用したくありませんが、渡されるものすべてに対して巨大なバイト配列として機能するカスタムストリームである可能性があります。

Boostのarray_sourceとarray_sinkを確認してください。

ライブデモ

#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
#include <iostream>
#include <ostream>
using namespace boost;
using namespace std;

struct Data
{
    double value;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int)
    {
        ar & value;
    }
};

int main()
{
    Data d={3.1415926};
    char buffer[256];
    {
        iostreams::array_sink sink(buffer);
        iostreams::stream<iostreams::array_sink> stream(sink);
        archive::binary_oarchive out_archive(stream);
        out_archive << d;
    }
    Data restored = {0.0};
    {
        iostreams::array_source source(buffer);
        iostreams::stream<iostreams::array_source> stream(source);
        archive::binary_iarchive in_archive(stream);
        in_archive >> restored;
    }
    cout << boolalpha << ( restored.value == d.value ) << endl;
}

出力は次のとおりです。

true
于 2012-11-07T21:52:27.263 に答える