2

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

所以基本上,在一天结束时,我想要这样的东西:

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

当我想使用该数据时,我只需将其包装在“字节流”中并再次将其传递给 Boost 以反序列化回我的实际对象。

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

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

4

1 回答 1

6

无符号字符* my_obj = { 10, 48, 48, 30, 20 ... }

最好使用:

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

所以你会有数组,它知道它的大小,而不仅仅是开始的指针。另外,如果您不打算修改它,请添加 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;
}

输出是:

true
于 2012-11-07T21:52:27.263 回答