C++ Boost序列化:如何预测序列化结果的大小?
我这样使用booost序列化:C++ Boost序列化:如何预测序列化结果的大小?,c++,serialization,boost,structure,C++,Serialization,Boost,Structure,我这样使用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_ar
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;
头H(\uuuu-Magic,SSP\u-T\u-REQUEST,98,72,42,Date(),SSP\u-C\u-NONE);
标题Z;
一般来说,无法预测。这在很大程度上取决于存档格式。但是,完全跟踪对象时,子图可能会被忽略,而动态类型信息可以添加大量数据
如果可以为序列化数据提供暂存缓冲区,则可以先序列化到缓冲区,然后在发送有效负载之前发送大小(现在知道了)
会有额外的开销
- 对象跟踪(通过指针/引用序列化)
- 动态多态性(通过指向基的(智能)指针序列化)
- 版本控制(除非对涉及的类型禁用)
- 存档标题(除非已禁用)
- 代码转换(除非禁用)
以下是一些答案,为您提供有关这些调整点的更多信息:
- 调整内容(boost::archive::no_codevt、boost::archive::no_头等)
如果所有数据都是POD,那么很容易预测大小
开箱即用
如果您在同一台机器上共享IPC,并且已经使用循环缓冲区,考虑将循环缓冲区放入共享内存。
我有很多答案(搜索managed\u shared\u memory
或managed\u mapped\u file
)和这些例子
下面是一个具体示例,重点介绍无锁单生产者/单消费者场景:
即使您选择/需要流式传输消息(例如通过网络),您仍然可以使用,例如。因此,即使不要求所有数据都是POD,也无需进行任何序列化。(诀窍是在内部使用offset_ptr
代替原始指针,使所有引用都是相对的)。创建您自己的流类并重写xsputn
方法
class counter_streambuf : public std::streambuf {
public:
using std::streambuf::streambuf;
size_t size() const { return m_size; }
protected:
std::streamsize xsputn(const char_type* __s, std::streamsize __n) override
{ this->m_size += __n; return __n; }
private:
size_t m_size = 0;
};
用法:
Header H(__Magic, SSP_T_REQUEST, 98, 72, 42, Date(), SSP_C_NONE);
counter_streambuf csb;
boost::archive::binary_oarchive oa(csb, boost::archive::no_header);
oa & H;
cout<<"Size: "<<csb.size();
头H(\uuuu-Magic,SSP\u-T\u-REQUEST,98,72,42,Date(),SSP\u-C\u-NONE);
中央统计局柜台;
boost::archive::binary\u-oarchive-oa(csb,boost::archive::no\u头);
oa&H;
cout和Q&A似乎提供了证据,证明在序列化实际发生之前,实际上不可能确定boost::archive
的大小。但是我根本不是一个boost
序列化专家。但是这给了你序列化后的大小。除非你为运输保留数据(sehe在四年前更详细地介绍了这一点),否则就太晚了。