使用自定义模式进行序列化,并使用Boost进行随机访问
Serialization with a custom pattern and random access with Boost
我问这里是因为我已经尝试过搜索,但我不知道这些东西是否存在,也不知道它们的名字是什么。
我开始解释,使用自定义模式,我的意思是:假设我需要序列化类型为foo、bar和boo的对象或数据,通常库会以一种非常简单的方式为用户处理这一问题,在序列化过程中,先出现的内容会先出现,所以如果我先序列化所有的foo,它们会被写在文件的"顶部",所有的bar和boo都在foo之后。
现在我想在我的文件中保持秩序,并根据自定义模式组织事情,Boost可以做到这一点吗?哪个部分提供了此功能?
第二件事,这与第一件事严格相关,我也想访问我的序列化二进制文件,这样我就不必解析和读取以前的所有值,只提取我感兴趣的值,有点像RAM,它基于内存地址工作,提供随机访问,而不必解析所有其他地址。
谢谢。
关于第一个问题:Boost序列化库不知道将对象转换为序列化形式后会发生什么。它通过使用输入和输出流来实现这一点。文件就是这样的-fostream/fstream。然而,对于其他类型的流,您所说的顺序/模式没有意义。想象一下,你正在通过网络发送序列化的对象——库不知道它必须重新排列对象的顺序,事实上,一旦它们被发送,它就无法做到这一点。出于这个原因,它不支持您正在寻找的内容。
您所能做的是创建一个包装器,该包装器要么只缓存对象的序列化版本,并在您告诉它将它们写入文件之前将它们排列在内存中,要么知道由于您正在处理文件,它可以稍后将tellg
添加到文件中的适当位置并进行附加(这种方法需要您存储写入文件的对象的位置)。
至于第二件事——随机访问文件读取。你必须知道对象在内存中的确切位置。如果您知道文件的结构不会改变,那么可以在将文件流交给boost进行反序列化之前对其进行seekg
。但是,如果文件结构将发生更改,则仍然需要知道对象在文件中的位置。如果您不想解析文件来找到它,那么在序列化过程中必须将它存储在某个地方。例如,您可以在文件顶部维护一种对象注册表。您仍然需要解析它,但它应该只是一个简单的[Object identifier]-[location in file]
类型的东西。
- 理解boost::asio-async_read在无需读取内容时的行为
- 浏览器将随机HTTP消息正文发送到我的boost.asio服务器.我可以更改此设置吗?
- 在Boost Graph库中选择给定顶点的随机进出邻居的有效方法
- Boost Graph库中边缘的随机访问(或其他快速访问)
- 使用Boost随机基础设施,但如何轻松更换组件(例如底层生成器)
- 随机分配给 boost::p tr_vector
- 使用自定义模式进行序列化,并使用Boost进行随机访问
- 使用Boost :: Graph随机访问顶点
- 如何将随机(boost.random)库包装在类中
- 在使用 BOOST 图形库生成的图形中添加随机边
- 使用boost::random库获取整数随机值而不是实数
- 如何使用boost asio将端口正确随机分配给测试HTTP服务器
- 使用boost C++从逆伽马分布生成随机样本
- 了解boost::随机统计测试的结果
- 在CentOS 6.4上使用Boost.Regex 1.53和gcc 4.8.1随机断言失败
- 比使用流来保存boost随机生成器状态更快的替代方案
- Boost随机样本,如python random.sample
- 标准多元正态随机向量使用Boost::random
- boost::spirit-从随机放置的条目中解析AST样式
- 如何在没有for循环的情况下请求boost::normaldistribution生成一个大的随机变量向量