我正在尝试采用复杂的嵌套结构,并将其直接存储在.cpp文件中作为静态数据。我想采取的方法是获取我的对象(已经支持Boost序列化)并将其作为二进制存档序列化为字节数组。然后,我可以获取该字节数组,并遍历它以自动生成所需的.cpp代码以保存二进制数组。然后,我想从该字节数组反序列化回对象。
所以基本上,在一天结束时我会喜欢这样的事情:
unsigned char* my_obj = { 10, 48, 48, 30, 20 ... }
当我想使用那些数据时,我只是将它包装在“字节流”中并再次传递给Boost以反序列化回我的实际对象。
我的问题是:是否有一些简单的方法可以将字节数组作为流传递? Boost处理istreams和ostreams来读取和编写档案。我不想使用字符串流或文件流,而是我想的可能是一个自定义流,它只是作为传递给它的任何内容的巨大字节数组。
我觉得应该有一个很好的方法来创建这个自定义流并让它无缝地与Boost序列化一起工作......我只是不确定从哪里开始?
答案 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。
#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