gpt4 book ai didi

c++ - boost 序列化 : How To Predict The Size Of The Serialized Result?

转载 作者:太空宇宙 更新时间:2023-11-04 13:33:46 25 4
gpt4 key购买 nike

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

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 大。

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

谢谢大家

最佳答案

一般来说,这是无法预测的。它(很大程度上)取决于存档格式。但是,如果完全跟踪对象,子图可能会被省略,而如果使用动态类型信息,则可以添加大量数据。

如果您能负担得起序列化数据的临时缓冲区,您可以先序列化到缓冲区,然后在发送负载之前发送大小(现在您知道了)。

会有开销

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

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

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

开箱即用

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

我有很多答案(搜索 managed_shared_memorymanaged_mapped_file )和这方面的例子。

这里是一个具体示例,重点关注无锁单一生产者/单一消费者场景:Shared-memory IPC synchronization (lock-free)

即使您选择/需要流式传输消息(例如通过网络),您仍然可以使用例如Managed External Buffers .因此,您无需执行任何序列化,即使不需要所有数据都是 POD。 (诀窍是在内部使用 offset_ptr<> 而不是原始指针,使所有引用都是相对的)。

关于c++ - boost 序列化 : How To Predict The Size Of The Serialized Result?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30494467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com