使用自定义模式进行序列化,并使用Boost进行随机访问

Serialization with a custom pattern and random access with Boost

本文关键字:Boost 随机 访问 自定义 序列化 模式      更新时间:2023-10-16

我问这里是因为我已经尝试过搜索,但我不知道这些东西是否存在,也不知道它们的名字是什么。

我开始解释,使用自定义模式,我的意思是:假设我需要序列化类型为foo、bar和boo的对象或数据,通常库会以一种非常简单的方式为用户处理这一问题,在序列化过程中,先出现的内容会先出现,所以如果我先序列化所有的foo,它们会被写在文件的"顶部",所有的bar和boo都在foo之后。

现在我想在我的文件中保持秩序,并根据自定义模式组织事情,Boost可以做到这一点吗?哪个部分提供了此功能?

第二件事,这与第一件事严格相关,我也想访问我的序列化二进制文件,这样我就不必解析和读取以前的所有值,只提取我感兴趣的值,有点像RAM,它基于内存地址工作,提供随机访问,而不必解析所有其他地址。

谢谢。

关于第一个问题:Boost序列化库不知道将对象转换为序列化形式后会发生什么。它通过使用输入和输出流来实现这一点。文件就是这样的-fostream/fstream。然而,对于其他类型的流,您所说的顺序/模式没有意义。想象一下,你正在通过网络发送序列化的对象——库不知道它必须重新排列对象的顺序,事实上,一旦它们被发送,它就无法做到这一点。出于这个原因,它不支持您正在寻找的内容。

您所能做的是创建一个包装器,该包装器要么只缓存对象的序列化版本,并在您告诉它将它们写入文件之前将它们排列在内存中,要么知道由于您正在处理文件,它可以稍后将tellg添加到文件中的适当位置并进行附加(这种方法需要您存储写入文件的对象的位置)。

至于第二件事——随机访问文件读取。你必须知道对象在内存中的确切位置。如果您知道文件的结构不会改变,那么可以在将文件流交给boost进行反序列化之前对其进行seekg。但是,如果文件结构将发生更改,则仍然需要知道对象在文件中的位置。如果您不想解析文件来找到它,那么在序列化过程中必须将它存储在某个地方。例如,您可以在文件顶部维护一种对象注册表。您仍然需要解析它,但它应该只是一个简单的[Object identifier]-[location in file]类型的东西。