2012-11-07 30 views
2

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

因此,基本上,在这一天结束时,我想是这样的:

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

当我想用这些数据,我只是把它包起来的“字节流”并通它进入Boost再次反序列化回我的实际对象。

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

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

+1

不过听起来像是你是一个ostringstream – 111111

+0

后哦,是吗?我认为这不是工作的工具,因为我真的不想要一个字符串,但也许你是对的!我会尝试一下,看看是否有效... – aardvarkk

+1

嗯,我不确定这是否是“理想”工具,但是如果您想将数据存储到我能想到的最好的临时流中。或者,如果你只需从令牌化代码中创建字符串,那也很容易。 – 111111

回答

5

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

这是更好地使用:

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

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


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

检查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 
+1

哦,这看起来相当不错!我明天会试试这个,谢谢! – aardvarkk

+0

这绝对让我走上正轨。我结束了使用这里显示一个非常类似的技术:http://stackoverflow.com/questions/3015582/direct-boost-serialization-to-char-array/5604782#comment18123762_5604782 在这种方法中,我不需要事先知道缓冲区大小,这就是我需要的。谢谢! – aardvarkk

+0

这留下了一个非常重要的情况:当你想存储的字节数组是一个类的成员。如果你不知道字节数组的大小,那么你使用在构造函数中分配的unsigned char *成员。然而,boost不能序列化指向原始类型的指针,它不受支持(https://stackoverflow.com/questions/19076299/how-do-i-serialize-a-class-containing-pointers-to-primitives/19077087#19077087 )。 std :: string可以工作,如果它不是因为char *中的0x0(对二进制数据完全有效)被解释为空终止符的事实。 – SullX