Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost序列化:如何预测序列化结果的大小?_C++_Serialization_Boost_Structure - Fatal编程技术网

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

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

我这样使用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;
头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在四年前更详细地介绍了这一点),否则就太晚了。