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

Serialization into static data using Boost and IOStreams

本文关键字:静态 数据 序列化 iostreams Boost 使用      更新时间:2023-10-16

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

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

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

当我想使用该数据时,我将其将其包装在"字节流"中,然后再次将其传递到Boost中,以重新启动回到我的实际对象中。

我的问题是:是否有一些简单的方法可以将字节阵列作为流?Boost涉及用于阅读和写档案的iStreams和ostreams。我不想使用弦流或文件流,而是我想是一个自定义流,仅充当传递给它的巨型字节数组。

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

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

最好使用:

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

因此,您将拥有数组,它知道它的大小,而不仅仅是指针开始。另外,如果您不打算对其进行修改,请添加句子。


我的问题是:是否有一些简单的方法可以将字节阵列作为流?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