gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:05 25 4
gpt4 key购买 nike

使用像 boost::serialize 这样的通用库来序列化和反序列化数据结构或多或少是相当容易的。

但也有一种常见的情况,我只是简单地做一些事情(伪代码):

// receiver
NetworkInputStreamSerialzer stream;

while (1) // read new data objects from stream
{
stream & data;
}

如我所料,数据包必须已经从网络套接字中完整接收。如果只能读取对象的一部分,反序列化将失败。特别是对于大型数据集,TCP 会将数据分段。

有没有通用的方法来处理这个问题?我在 boost::serialize 的文档中没有发现任何关于这个问题的提示。

由于这个问题对于任何类型的流数据都是通用的,不仅对于基于 TCP 的流数据,而且对于一个程序发送数据而另一个程序接收数据的文件也是如此,因此必须有一个通用的解决方案,但我找不到任何相关信息。

我的问题不是专门用来提升的。我仅将其用作示例。

编辑:也许对我的“碎片化”措辞有更多解释:

任何类型的数据,无论其以序列化格式生成的大小如何,都可以在通过 TCP 传输或写入任何类型的文件时分成多个包。操作系统和我所知道的序列化库都不支持任何类型的“原子”写入和读取操作。

因此,如果从 XML 或 JSON 之类的人类可读格式读取 int,我会遇到这样的问题:如果我读取的那一刻“2”不在流或文件中,我读取的是“11”而不是“112”从中读取。因此,以人类可读的格式写入以下内容的长度也不是解决方案,因为当读取发生在此时内容字符串不完整的时刻时,大小信息本身可能会被破坏。

最佳答案

[注意:我从您的问题中得到一种感觉,您想要针对您的特定情况使用更好的 boost::serialization 替代方案。如果这不能回答您的问题,请告诉我,我会删除它。]

推荐使用Google Protocol Buffers从我自己的实践经验来看。以下是一些优点:

  1. 可用于有线网络(TCP等)
  2. 编写 .proto 文件的简单语法,用于编写您自己的文件留言
  3. 跨平台且支持多种语言
  4. 与 JSON 和 XML 相比非常高效
  5. 为方便的 getter、setter、序列化生成头文件和源文件,反序列化和调试目的
  6. 易于序列化和反序列化——存储到文件和从文件中检索

最后一点有点棘手。在文件中存储时,您可能必须先插入消息的长度,而在检索时,您可能必须先读取该长度,然后使用 read() 方法读取确切的字节数.

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

关于c++ - 从流或文件中动态反序列化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38786210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com