1

我正在阅读其他人编写的项目的代码。该项目的主要任务是将包含 8 列的大型结构化文本文件 (.txt) 的内容读取到 KnowledgeBase 对象中,该对象具有许多方法和变量。然后将 KnowledgeBase 对象输出到二进制文件中。例如,KnowledgeBase 类至少有这两个变量:

map<string, pair<string, string>> key_info
vector<ObjectInfo> objects
...

当我使用 gdb 跟踪代码时,这些变量很容易理解。然后,它似乎正在将这些向量和映射转换为二进制形式。并且上面的两个变量都有对应的二进制形式:

BinaryKeyInfo *bkeys
BinaryObjectInfo *bObjects

后来输出到二进制文件时,它有这样的代码:

fwrite((char*)(&wcount),sizeof(int32_t),1,output);
fwrite((char*)bkeys,sizeof(KeyInfo_t),wcount,output);

从原始知识库到二进制的转换代码很复杂。我的问题是,这种转换的主要目的是什么?是否比纯文本文件更快地将二进制文件加载到内存中?纯文本文件很大。我了解到对象序列化主要用于通过网络传输对象,但我不认为这里的目的是为了这个。它更像是为了加快数据加载和节省内存。这可能是 C++ 中对象序列化的一部分吗?

4

1 回答 1

4

C++ 中对象序列化的主要目的是为了更快地加载对象吗?

不。序列化的最重要目的是将程序的状态转换为可以存储在文件系统上的格式,或者可以通过网络进行通信的格式,并且可以反序列化回来。通常,两者的目的是让另一个程序进行反序列化。有时反序列化器是同一程序的另一个实例。

反序列化的速度是一种衡量标准,可以用来衡量一种特定的序列化格式是否是好的。快速撤消您所做的事情的能力并不是您首先这样做的原因。

将它们转换为二进制向量或映射有什么好处?

正如我上面提到的,序列化的好处是能够将序列化的数据存储在文件系统上,或者通过网络发送。

纯文本文件与二进制文件之间有什么好处?

文本序列化格式的优点:

  • 人类能够阅读和书写纯文本。人类通常无法读写二进制文件。
  • 以在不同计算机上工作的方式实现纯文本格式反序列化器通常比实现实现相同目的的二进制格式反序列化器更容易。

二进制序列化格式的优点:

  • 通常更快,使用更少的存储和带宽。
  • 如果不需要不同系统之间的通信,则可以更容易实施。这通常仅在非常简单的情况下才会出现。(此外,通常需要跨系统兼容性,即使该需要尚未实现)。
于 2021-12-07T00:23:06.527 回答