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



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

我在官方文件上找不到答案,在stackoverflow上也找不到。

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

但是如何在某个缓冲区中进行二进制序列化-没有任何信息。有人能示范一下怎么做吗?

(我认为这是错误的方式,因为二进制可能有很多null-s,但sting-不要(

C++字符串包含NUL字符,很好的

但是如何在某个缓冲区中进行二进制序列化-没有任何信息。有人能示范一下怎么做吗?

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

然而,如果你认为缓冲区只有当你有一个裸露的char数组或其他什么的时候,你可以"安装件";一条小溪流到那里。现在这是应该std::streambuf没有太多的工作,但我所知道的一点是,它在char_traits方面变得很棘手。

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

在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"

最新更新