C++ 使用自定义模式进行序列化和使用Boost进行随机访问

C++ 使用自定义模式进行序列化和使用Boost进行随机访问,c++,serialization,boost-serialization,C++,Serialization,Boost Serialization,我在这里提问是因为我已经尝试过搜索,但我不知道这些东西是否存在,它们的名字是什么 我开始解释自定义模式,我的意思是:假设我需要序列化foo、bar和boo类型的对象或数据,通常库以一种非常简单的方式为用户处理这一点,在序列化过程中,先到先得,所以如果我先序列化所有的foo,它们将被写在“顶部”所有的酒吧和boo都在foo后面 现在我想在我的文件中保持秩序,并根据自定义模式组织事情,Boost能做到这一点吗?哪个部分提供此功能 第二件事,与第一件事严格相关,我还希望以一种不必解析和读取所有先前值的

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

我开始解释自定义模式,我的意思是:假设我需要序列化foo、bar和boo类型的对象或数据,通常库以一种非常简单的方式为用户处理这一点,在序列化过程中,先到先得,所以如果我先序列化所有的foo,它们将被写在“顶部”所有的酒吧和boo都在foo后面

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

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


谢谢。

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

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


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

这里不涉及网络,我只想在代码中的任何地方自由调用序列化的保存和加载函数,而不检查以前的反序列化或缓存结果。这项工作是为了保持代码干净和业务逻辑简单,如果我能做到这一点,这将是最好的选择对于我和我来说,fect解决方案真的可以有效地使用自定义格式的序列化文件。我只提到了网络问题作为一个例子,说明了为什么boost不支持您所寻找的内容。如果您想保持所有内容的整洁,您可以实现自己的流,为每个对象在文件中找到合适的位置(基本上是上面第二段的想法,只内置到流中,而不是单独的缓存)。