【问题标题】:Is it possible to parse directly to nested PODs with boost-spirit?是否可以使用 boost-spirit 直接解析为嵌套的 POD?
【发布时间】:2017-08-05 02:59:26
【问题描述】:

我的任务是使用一些通过网络以文本形式出现的复杂数据调用 C API 函数。人们可能会想到某种形式的 RPC。函数调用非常频繁,因此性能要求非常严格。目前我直接用手动编写的解析器将输入流解析为对应的POD结构。问题是这个解析器是巨大的。是的,有时我会在其中发现错误。我想尝试切换到 boost 以降低代码的复杂性。希望我也可以提高性能,以防我可以使用内存池。在当前的解决方案中,考虑到所有这些都是多线程的,添加这种复杂性看起来令人生畏。

简化的输入数据类似于functionName({x,x,x,{x,x,x},<null>,x}),其中每个x 是某种类型的原始值或文本字符串(表示为"blah"<null>)。每个缺失的结构都由<null> 表示。

输出数据是一个POD结构。在字符串或嵌套结构作为字段的情况下,指向已分配数据的指针存储在外部数据中。如果值丢失,它可能为 null。

通过 SO 答案和 boost 文档进行挖掘,我找不到如何有效地完成这项任务,即在将结构解析为一些内部“boost-friendly”形式后,没有将其重建为 POD。

再次重复主题,问题是如何解析具有指针的嵌套 POD 结构

感谢任何帮助。

【问题讨论】:

  • 我曾经实现过类似的功能 - 出于数据序列化的目的(我想将 C++ 对象保存到文件中,然后将它们加载回来)。加上对修补(代码版本控制)的支持导致了一个小模块,但它并不大。但我为此目的使用了纯 C++...
  • 发布一些你认为应该做你想做的事情的代码。您将需要保留一个“全局”上下文对象,用于记录之前是否见过对象。
  • 您可能想看一下 capnproto.org ,由以前在 Google Protobuf 工作的 Kenton Varda 编写。使用其他人为您维护的现有解决方案有很多话要说:)

标签: c++ parsing boost boost-spirit


【解决方案1】:

根据所述目标,我会考虑 Boost Interprocess 中的 Boost Serialization 或 Boost Managed Buffers(可选在共享内存中)。

提升序列化

EAS portable archivesthe various flags to avoid some overheads 一起使用

促进进程间

如果对象图是“复杂的”(例如,可能包含 multi_index_container,或可能例如使用共享对象表示进行压缩的相互关联的非 POD),这将大放异彩。这有点涉及,但使您在托管缓冲区(使用标准分配器)中所做的任何事情都可以按位序列化。

这里没有可移植的格式:库是可移植的,但在一个平台/版本上序列化的数据无法在不同的平台/版本上读取。

参见例如

还有很多其他的,取决于您想要实现的目标。

【讨论】:

  • 感谢您的回答。是不是说 boost::spirit 不能完成任务?
  • 当然不是。我只是碰巧同意大多数人的观点,即不值得为此做管道。我已经使用 Spirit 来解析 JSON 序列化(通常),使用复杂的机器来执行“反射”和 OData 注释,但我真的不认为这值得麻烦。使用图书馆。 Protobuf、Cap'n proto、Cereal、Boost 序列化等
  • (PS. 如果你觉得我不是boost-spirit 的粉丝,看看top users for that tag :))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多