如何使用 Boost 在缓冲区中进行二进制序列化

How to binary serialize in a buffer with Boost

如何在缓冲区中进行二进制序列化?

我没有在官方文档中找到答案,在 Whosebug 上也找不到答案。

大部分示例展示了如何在某些文件中进行二进制序列化。 其他部分展示了如何在字符串中进行二进制序列化。 (我认为这是错误的方式,因为二进制可能有很多 null-s,但 sting - 不要)

但是如何在某些缓冲区中进行二进制序列化 - 没有信息。 有人可以告诉我怎么做吗?

(I think this is wrong way because binary could have a lot of null-s, but sting - don't)

C++ 字符串包含 NUL 字符就好了

But how to binary serialize in some buffer - there are no information. Could someone show how to do it?

字符串也是“一些缓冲区”。因此,使用 std::stringstream(您可能已经看到)已经 回答了您的问题。

但是,如果您认为只有当您有裸露的 char 数组或其他东西时才存在缓冲区,您可以将流“挂载”到它上面。现在这是 应该 std::streambuf 没有太多的工作,但我所知道的一点是它在 char_traits.

周围变得棘手

所以,让我们做简单的事情并使用已经做到这一点的 Boost Iostreams 类型:

Live On Coliru

#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/string.hpp>
#include <iostream>
#include <iomanip>

namespace bio = boost::iostreams;
using Map = std::map<int, std::string>;

int main()
{
    char buf[1024*10];

    {
        bio::stream<bio::array_sink>    os(buf);
        boost::archive::binary_oarchive oa(os);
        oa << Map{
            {1, "one"},  {2, "two"},  {3, "three"},
            {4, "four"}, {5, "five"}, {6, "six"},
        };
    }

    {
        bio::stream<bio::array_source>  is(buf);
        boost::archive::binary_iarchive ia(is);
        Map m;
        ia >> m;

        for (auto& [k,v] : m)
            std::cout << " - " << k << " -> " << std::quoted(v) << "\n";
    }
}

打印

 - 1 -> "one"
 - 2 -> "two"
 - 3 -> "three"
 - 4 -> "four"
 - 5 -> "five"
 - 6 -> "six"