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

时间:2012-11-07 20:28:09

标签: c++ serialization boost bytearray

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

  

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

最好使用:

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

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


  

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

检查Boost's array_source and array_sink

live demo

#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