使用boost :: serialize等公共库来序列化和反序列化数据结构或多或少都很容易。
但是有一个常见的例子,我只是做一些像(伪代码)的事情:
// receiver
NetworkInputStreamSerialzer stream;
while (1) // read new data objects from stream
{
stream & data;
}
正如我所料,必须已经从网络套接字完成数据包的完整接收。如果只能读取对象的一部分,则反序列化将失败。特别是对于大型数据集,TCP将对数据进行分段。
有没有通用的方法来处理这个问题?我没有在boost :: serialize。
的文档中找到任何关于这个问题的提示由于此问题对于任何类型的流数据都是通用的,不仅对于基于TCP的流,而且对于一个prog发送而另一个接收数据的文件,必须有一般解决方案,但我找不到任何关于。< / p>
我的问题不是专门提升。我只把它作为一个例子。
编辑: 也许对我的“碎片化”措辞有更多的解释:
任何类型的数据,无论其以序列化格式生成的大小如何,都可以在多个包中进行分段,同时通过TCP传输或将其写入任何类型的文件。操作系统不支持任何类型的“原子”写入和读取操作,而不是我所知道的序列化库。
因此,如果从人类可读的格式(如XML或JSON)读取int,我可以得到的问题是,如果“2”不在流或文件中的那一刻我读“11”而不是“112”从中读取。因此,以人类可读格式编写以下内容的长度也不是解决方案,因为在此时内容字符串未完成的时刻发生读取时,大小信息本身可能已损坏。
答案 0 :(得分:0)
[注意:我从你的Q中得到一个感觉,你想为你的具体案例找到boost::serialization
的更好的选择。如果这不能回答你的问题,请告诉我,我会将其删除。]
根据我自己的实践经验,建议使用Google Protocol Buffers。以下是一些优点:
最后一点有点棘手。存储在文件中时,您可能必须先插入消息的长度,然后在检索时,您可能必须先读取该长度&amp;然后使用read()
方法读取确切的字节数。
您可能希望在传递TCP时使用相同的技巧。在前几个字节中,可以传递长度。确定长度后,您始终可以收集剩余的碎片消息。