架构不固定时如何使用平面缓冲区?

时间:2019-01-25 09:52:49

标签: c++ serialization deserialization ipc flatbuffers

我的C ++应用程序的当前工作如下:

1.它涉及启动另一个进程,并使用Windows共享内存在两个进程之间进行通信。
2.数据在一个进程中被序列化,而在另一进程中被反序列化。但是,数据类型也可能会根据用户输入而有所不同,因此,该类型也会进行序列化,以便解串器可以正确解释数据。

现在,我打算使用平面缓冲区对数据进行序列化和反序列化(由于其明显的优势-随机访问和向后兼容)。
但是,要做到这一点,我需要在某些方面进行明确说明,并希望对此有所帮助。

  1. 基于数据类型,我可以以编程方式生成架构,并将其提供给flatc.exe来生成文件。但是,我不是在使用flatc.exe,而是在构建flatc.dll(从开放源代码),并使用它来简化交互。听起来更明智吗?

  2. 其次,我更不确定的是以下内容。我将创建一个架构,并在应用程序运行时调用“平面缓冲区编译器”。它将生成一些C ++文件。现在,据我所知,我将需要以某种方式构建这些文件,并且应该将已构建的二进制文件插入序列化器和反序列化器中,以对实际数据进行序列化和反序列化,而这一切都是在应用程序运行时完成的。如何实现所有这些?
    这个问题都是由于我的应用程序没有固定的架构而引起的。当模式可变时,使用平面缓冲区的一般方法是什么?

我希望我清楚我要问的问题。如果没有,请告诉我。我很乐意提供更多细节。感谢您的提前答复。

1 个答案:

答案 0 :(得分:1)

答案是您不希望这样做。尽管这是可行的,尤其是C ++的运行时生成,但是将其编译为DLL然后再将其加载回您的进程是一种非常笨拙的方式。

您的程序的数据结构必须在编译时就知道(如果它是用C ++编写的),那么为什么不能为它一次定义一个架构并提前进行编译呢?您的程序是否允许用户在运行时“设计”数据结构?

对于极端动态的用例(例如用户可以创建任意对象的情况),我建议使用FlexBuffers(https://google.github.io/flatbuffers/flexbuffers.html)。它们可以在FlatBuffer内部使用,以存储“未知”数据,甚至可以用作其自己的序列化格式。有了这些,您可以序列化仅在运行时才知道其结构的对象,它们具有FlatBuffers的大多数相同的效率属性,并且您不需要将C ++编译器与程序捆绑在一起:)

最佳是两者的结合,所有编译时已知的数据都存储在FlatBuffers中,其余的存储在FlexBuffers中。