使用Boost和IOStreams序列化为静态数据

aar*_*rkk 2 c++ serialization boost bytearray

我正在尝试采用复杂的嵌套结构,并将其直接存储在.cpp文件中作为静态数据.我想采取的方法是获取我的对象(已经支持Boost序列化)并将其作为二进制存档序列化为字节数组.然后,我可以获取该字节数组,并遍历它以自动生成所需的.cpp代码以保存二进制数组.然后,我想从该字节数组反序列化回到对象中.

所以基本上,在一天结束时我会喜欢这样的事情:

unsigned char* my_obj = { 10, 48, 48, 30, 20 ... }
Run Code Online (Sandbox Code Playgroud)

当我想使用那些数据时,我只是将它包装在"字节流"中并再次传递给Boost以反序列化回我的实际对象.

我的问题是:是否有一些简单的方法将字节数组作为流传递?Boost处理istreams和ostreams来读取和编写档案.我不想使用字符串流或文件流,而是我想可能是一个自定义流,它只是作为传递给它的任何东西的巨大字节数组.

我觉得应该有一个很好的方法来创建这个自定义流并让它与Boost序列化无缝地工作......我只是不确定从哪里开始?

Evg*_*yuk 5

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

最好使用:

unsigned char my_obj[] = { 10, 48, 48, 30, 20 ... }
Run Code Online (Sandbox Code Playgroud)

所以你将拥有数组,它知道它的大小,而不仅仅是开始的指针.另外,如果您不打算修改它,请添加const.


我的问题是:是否有一些简单的方法将字节数组作为流传递?Boost处理istreams和ostreams来读取和编写档案.我不想使用字符串流或文件流,而是我想可能是一个自定义流,它只是作为传递给它的任何东西的巨大字节数组.

检查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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

true
Run Code Online (Sandbox Code Playgroud)