- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我以这种方式使用 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 大。
如何确定对方的数据是完整的?我使用循环缓冲区但带有序列化怎么办?
谢谢大家
最佳答案
一般来说,这是无法预测的。它(很大程度上)取决于存档格式。但是,如果完全跟踪对象,子图可能会被省略,而如果使用动态类型信息,则可以添加大量数据。
如果您能负担得起序列化数据的临时缓冲区,您可以先序列化到缓冲区,然后在发送负载之前发送大小(现在您知道了)。
会有开销
以下是一些答案,可为您提供有关这些调整点的更多信息:
如果您的所有数据都是 POD,则很容易预测大小。
如果您在同一台机器上共享 IPC,并且您已经在使用循环缓冲区,请考虑将循环缓冲区放入共享内存中。
我有很多答案(搜索 managed_shared_memory
或 managed_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/
我是一名优秀的程序员,十分优秀!