如何使用boost序列化进行二进制输出?

Posted

技术标签:

【中文标题】如何使用boost序列化进行二进制输出?【英文标题】:How to use boost serialization for binary output? 【发布时间】:2019-01-30 08:57:19 【问题描述】:

函数 boost::serialization::binary_object(void * t, size_t size) 和 boost::serialization::make_binary_object(void * t, size_t size) 有什么区别?

如何使用它们来获取实际的输出二进制文件?

【问题讨论】:

【参考方案1】:

欢迎来到 SO!!

这是一个展示如何使用它的示例。

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/binary_object.hpp>
#include <boost/serialization/serialization.hpp>
#include <iostream>
#include <sstream>

using boost::serialization::make_binary_object;

enum class Example : uint8_t 
    A = 1,
    B = 2,
;

int main() 

    std::stringstream stream;
    boost::archive::binary_oarchive ar(stream, boost::archive::no_header);

    auto data = Example::A;
    ar << make_binary_object(&data, sizeof(data));

    std::cout << "Size: " << stream.str().size() << "\n";

如果你想将二进制对象保存在一个文件中,这里有一个例子,它将它保存在一个名为 data.dat 的文件中

#include <fstream>

using boost::serialization::make_binary_object;

enum class Example : uint8_t 
    A = 1,
    B = 2,
;

int main() 

    std::ofstream f("data.dat", std::ofstream::binary);
    boost::archive::binary_oarchive ar(f, boost::archive::no_header);

    auto data = Example::A;
    ar << make_binary_object(&data, sizeof(data));  

运行代码后,文件如下所示

来自@StoryTeller 发布的 boost 源代码 cmets make_binary_object() 只是支持所有序列化包装器遵循命名约定 make_xxxxx 的约定的一个小帮手

【讨论】:

我不明白一件事,我怎样才能得到以特定名称保存的二进制文件到文件夹中。 只需使用文件流 fstream,您可以在 Internet 上找到示例。请将我的答案标记为正确.. 谢谢! 我将添加一个写入文件的示例。【参考方案2】:

boost::serialization::make_binary_object(void * t, size_t size) 是一个助手并调用boost::serialization::binary_object(void * t, size_t size)。提供帮助程序以保留命名约定 make_xxxxx

要将对象保存到二进制文件,您需要创建一个存档并调用 binary_objectvoid save(Archive &amp; ar, const unsigned int /* file_version */) 方法

【讨论】:

以上是关于如何使用boost序列化进行二进制输出?的主要内容,如果未能解决你的问题,请参考以下文章

Boost - 使用 TLV 编码序列化字符串

如何使用 boost std::vector of boost::unordered_map 进行序列化/反序列化

如何使用boost序列化?

提升序列化:可以安全地忽略警告?

如何创建 boost ssl iostream?

如何使用 Boost.serialize 序列化派生模板类?