从流或文件中动态反序列化数据

时间:2016-08-05 09:46:25

标签: c++ serialization

使用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”从中读取。因此,以人类可读格式编写以下内容的长度也不是解决方案,因为在此时内容字符串未完成的时刻发生读取时,大小信息本身可能已损坏。

1 个答案:

答案 0 :(得分:0)

[注意:我从你的Q中得到一个感觉,你想为你的具体案例找到boost::serialization的更好的选择。如果这不能回答你的问题,请告诉我,我会将其删除。]

根据我自己的实践经验,建议使用Google Protocol Buffers。以下是一些优点:

  1. 可以在线上使用(TCP等)
  2. 编写.proto文件以编写自己的简单语法 消息
  3. 跨平台&amp;提供多种语言
  4. 与JSON相比效率非常高XML
  5. 生成标题&amp;方便的getter,setter,serialize的源文件, 反序列化&amp;调试目的
  6. 易于序列化&amp;反序列化 - 存储到&amp;从文件中检索
  7. 最后一点有点棘手。存储在文件中时,您可能必须先插入消息的长度,然后在检索时,您可能必须先读取该长度&amp;然后使用read()方法读取确切的字节数。

    您可能希望在传递TCP时使用相同的技巧。在前几个字节中,可以传递长度。确定长度后,您始终可以收集剩余的碎片消息。