0

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

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

现在我想在我的文件中保持顺序并根据自定义模式组织事物,这可以通过 Boost 实现吗?哪个部分提供此功能?

第二件事,与第一件事密切相关,我还想以一种不必解析和读取所有先前值以仅提取我感兴趣的值的方式访问我的序列化二进制文件,有点像基于内存地址工作并提供随机访问而不强迫您解析所有其他地址的 RAM。

谢谢。

4

1 回答 1

1

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

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

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

于 2012-11-14T15:54:38.017 回答