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

C++ 使用Boost和IOStreams序列化为静态数据,c++,serialization,boost,bytearray,C++,Serialization,Boost,Bytearray,我试图采用复杂的嵌套结构,并将其作为静态数据直接存储在.cpp文件中。我想采用的方法是将我的对象(已经支持Boost序列化)序列化为二进制归档文件,并将其序列化为字节数组。然后,我可以获取该字节数组,并遍历它以自动生成所需的.cpp代码来保存二进制数组。然后,我想将该字节数组反序列化回对象 所以基本上,在一天结束的时候,我想要这样的东西: unsigned char* my_obj = { 10, 48, 48, 30, 20 ... } 当我想使用这些数据时,我只需将其包装在“字节流”中,并

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

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

unsigned char* my_obj = { 10, 48, 48, 30, 20 ... }
当我想使用这些数据时,我只需将其包装在“字节流”中,并再次将其传递到Boost中,以反序列化回我的实际对象

我的问题是:是否有一些简单的方法可以将字节数组作为流传递?Boost处理IStream和OStream以读取和写入归档文件。我不想使用stringstream或filestream,但我认为它可能是一个自定义流,对于传递给它的任何内容,它只是充当一个大字节数组

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

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

最好使用:

unsigned char my_obj[] = { 10, 48, 48, 30, 20 ... }
所以你们将有一个数组,它知道它的大小,而不仅仅是开始的指针。此外,如果不打算修改常量,请添加常量


我的问题是:是否有一些简单的方法可以将字节数组作为流传递?Boost处理IStream和OStream以读取和写入归档文件。我不想使用stringstream或filestream,但我认为它可能是一个自定义流,对于传递给它的任何内容,它只是充当一个大字节数组

检查

:


听起来你还是在追求一个ostringstreamOh是吗?我以为这不是工作的工具,因为我真的不想要字符串,但也许你是对的!我将尝试一些方法,看看它是否有效……我不确定它是否是“理想”的工具,但如果您想将数据存储到我能想到的最好的临时流中。或者,如果您可以从标记化的代码中生成字符串,这也会很容易。如果您担心
std::ostringstream
将生成数据的副本(它肯定会),那么您是否已经介绍过了。(只需确保以二进制模式打开流。)哦,这看起来非常棒!我明天就试试这个,谢谢!这无疑使我走上了正确的道路。我最终使用了一种非常类似的技术:在这种方法中,我不需要事先知道缓冲区的大小,而这正是我所需要的。谢谢这省略了一个非常重要的情况:当要存储的字节数组是类的成员时。如果事先不知道字节数组的大小,则使用构造函数中分配的无符号char*成员。但是boost无法序列化指向基元类型的指针,它不受支持()。如果不是因为char*中的0x0(对二进制数据完全有效)被解释为空终止符,std::string可能会起作用。如果需要序列化也是类成员的字节数组,请尝试std::vector。
#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