Boost序列化:如何预测序列化结果的大小?

2023-12-08

我以这种方式使用 boost 序列化:

Header H(__Magic, SSP_T_REQUEST, 98, 72, 42, Date(), SSP_C_NONE);
Header Z;

std::cout << H << std::endl;
std::cout << std::endl;

char serial_str[4096];

std::memset(serial_str, 0, 4096);

boost::iostreams::basic_array_sink<char> inserter(serial_str, 4096);
boost::iostreams::stream<boost::iostreams::basic_array_sink<char> > s(inserter);
boost::archive::binary_oarchive oa(s);

oa & H;
s.flush();

std::cout << serial_str << std::endl;

boost::iostreams::basic_array_source<char> device(serial_str, 4096);
boost::iostreams::stream<boost::iostreams::basic_array_source<char> > s2(device);
boost::archive::binary_iarchive ia(s2);

ia >> Z;

std::cout << Z << std::endl;

它工作得很好。

尽管如此,我需要在套接字上发送这些数据包。我的问题是,我如何知道另一端我需要读取多少字节?序列化结果的大小不是恒定的,顺便说一句,它比我的结构的 sizeof 大。

如何确定对方的数据是完整的?我使用循环缓冲区但使用序列化怎么办?

Thx all


一般来说,这是不可能预测的。这在很大程度上取决于存档格式。但是,通过完全对象跟踪,子图可能会被省略,并且通过动态类型信息,可以添加大量数据。

如果您能为序列化数据提供暂存缓冲区,则可以先序列化到缓冲区,然后在发送有效负载之前发送大小(现在您知道了)。

会有开销

  • 对象跟踪(通过指针/引用进行序列化)
  • 动态多态性(通过(智能)指向基点的指针进行序列化)
  • 版本控制(除非您对所涉及的类型禁用它)
  • 存档标头(除非禁用)
  • 代码转换(除非禁用)

以下是一些答案,可为您提供有关这些调整点的更多信息:

  • Boost C++ 序列化开销
  • Boost 序列化二进制存档给出不正确的输出
  • 矢量 的 Boost 序列化
  • 调整内容(boost::archive::no_codecvt、boost::archive::no_header、禁用跟踪 etc.)

如果您的所有数据都是 POD,则很容易预测其大小。

盒子外面

如果您在同一台机器上共享 IPC,并且已经在使用循环缓冲区,请考虑将循环缓冲区放入共享内存中。

我有很多答案(搜索managed_shared_memory or managed_mapped_file)并举例说明。

一个具体的例子,重点关注无锁的单一生产者/单一消费者场景:共享内存IPC同步(无锁)

即使您选择/需要流式传输消息(例如通过网络),您仍然可以使用例如托管外部缓冲区。这样你就可以避免需要做的事情any甚至不需要所有数据都是 POD 的序列化。 (诀窍是在内部,offset_ptr<>使用而不是原始指针,使所有引用都是相对的)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Boost序列化:如何预测序列化结果的大小? 的相关文章

随机推荐

  • 如何解码 HTTP 中 Content-Disposition 标头的文件名参数?

    This question提供了这方面的背景filename范围 我需要编写一个脚本来访问网络服务器上的一些文件 文件名包含无法用 ASCII 编码的 CJK 字符 curl I http bj baidupcs com file f6f2
  • JasperReport 参数在 iReport 中有效,但在 JasperServer 上失败

    我在 iReport 中创建了一份报告 使用 isForPrompting true 设置参数 当我用预览来测试它时 一切正常 Parameter Symbol SQL Query select from table where colum
  • 如何在没有浏览器的情况下与网站交互? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 假设我正在构建一个 C 应用程序 申请目的 从用户处获取用户名和密码 并显示网站上存在的
  • jQuery Mobile 不加载新页面脚本

    将 jQuery Mobile 与 Django 结合使用 在页面转换期间 基本脚本似乎加载正常 但从一个页面到下一个页面 标题下的新页面脚本不会在浏览器中加载 更具体 我通过输入网址加载主页 一切正常 我通过单击主页中的链接加载下一页 然
  • 使用与重复字段同名的字段时 BigQuery 会扁平化

    编辑以使用公共数据集 I have a table with the following schema which you can access here https bigquery cloud google com table real
  • 如何使用 Mojo 进行内部重定向?

    Catalyst 支持的重定向内部到框架 forward and detach 和外部 HTTP 重定向 res gt redirect 内部重定向本质上只是重新分派到新路径 假设我设置了两条路径 sub register self app
  • 使用 ViewPager 更改片段

    我在用PagerSlidingTab图书馆ViewPager 我想在滚动选项卡时更改片段 它运行良好 查看我的代码 我在用AsynTask 在各个Fragment 当应用程序通过 MainActivity 打开时 第一个 Fragment
  • 适用于 C、C++ 或 Fortran 的代码抛光器/重新格式化器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 假设您有一堆由不同作者用 C C 或 Fortran 编写的文件 在格式 如何注释等方面有不同的意见 我想很多人都知道这样的情况 是否有任何免费工具
  • Xamarin.Forms 警告:尝试在其视图不在 iOS 图像/手势识别器的窗口层次结构中的 * 上呈现 *

    我有一个模态导航页面 其中包含一个充当按钮的图像
  • Android Toolbar的Switch的actionLayout导致按下菜单时文本跳转

    请参考我的项目 https github com paulpv ToolbarSwitch 我正在为 Android 工具栏 又名 新 ActionBar 开发一个简单的自定义布局 这个简单的控件向工具栏添加了一个开关 可以在此处以洋红色突
  • 在Blackberry中,我们可以创建可供不同应用程序使用的通用库吗?

    我想创建一个通用的第三方库 它可以被不同的应用程序共享和使用 并且保持一致 我们可以实现这个目标吗 如果可以 这个库将如何安装以及在哪里安装 以及如何从其他应用程序访问这些库文件 是的 你可以这样做 您创建并编译该库 您可以在依赖它的应用程
  • 通过此与虚拟对象同步

    到目前为止 我已经看到了同步块的用法 但最近我了解到使用虚拟对象更好 我发现以下与此相关的主题 Java同步方法锁定对象或方法 总而言之 在下面的代码中 两个不同的对象不能同时运行 addA 和 addB 因为它们都使用 this 作为锁
  • Java:如何从图像数组创建电影?

    我基本上有一个字节矩阵 每行 即 byte 代表一个图像 如何创建一个电影 任何格式 avi mpeg 等等 并将其保存为文件 每个图像可以是以下之一 int JPEG Encoded formats int NV16 YCbCr form
  • 使用 Project Reactor 和 DirectoryStream 列出目录内容

    我想将 DirectoryStream 与 Project Reactor 一起使用来列出目录中的所有文件 我的尝试是 Path myDir Paths get C Users r dacanal Documents Reply EDA l
  • Hibernate:多对多关系表作为实体

    问题如标题所示 如何将多对多关系表作为实体 我想说 你的问题很有道理 看看这个文档部分 第 24 章最佳实践 摘录 不要使用外来关联映射 真正的多对多关联的实际测试用例很少 最多 您需要存储在 链接 中的附加信息的时间 table 在这种情
  • ImageIO write() 是阻塞方法吗?

    在我用 java 开发的应用程序中 我使用 ImageIO API 来缩放图像 然后将它们写入目录 然后通知 Web 服务器图像已准备好使用 向 Web 服务器发送信号之前的最后一个调用是 ImageIO write 方法 但 Web 服务
  • TinyMCE 4 插入链接表单字段已禁用

    我正在使用TinyMCE Railsgem 使用 TinyMCE 4 我正在加载link插件 所有这一切都是在颜色框弹出窗口之后 中启动的 TinyMCE 编辑器工作正常 但链接按钮会弹出一个对话框来添加 编辑链接 但除了target可供编
  • 使用openpyxl旋转Excel图表的轴

    那里 我正在尝试使用 openpyxl 来处理 Excel 数据 将图片绘制出来并导出它们就可以了 但是 x axis 不够漂亮 我想旋转它 但在文档中没有找到解决方案 这是使用 XlsxWriter 的解决方案 solution 我的代码
  • 如何自动展开和打印 TreeView

    我创建了一个应用程序 它会扫描每台计算机 并使用硬件 软件和更新 修补程序信息填充 TreeView 我遇到的问题是打印 如何自动展开树视图并将所选计算机的结果发送到打印机 我当前使用的方法是将内容发送到画布 BMP 然后将其发送到打印机
  • Boost序列化:如何预测序列化结果的大小?

    我以这种方式使用 boost 序列化 Header H Magic SSP T REQUEST 98 72 42 Date SSP C NONE Header Z std cout lt lt H lt lt std endl std co