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

How to use flat buffers when the schema is not fixed?

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

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

现在,我打算使用flat-buffer来序列化和反序列化数据(因为它的明显优势——随机访问和向后兼容)。
但是,要做到这一点,我需要在某些方面弄清楚并希望得到一些帮助。

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

  2. 其次,我比较不确定的是以下几点。当应用程序处于 运行 时,我将创建一个模式并调用 'Flat Buffer compiler'。它将生成一些 C++ 文件。现在,据我所知,我需要以某种方式构建这些文件,构建的二进制文件应该同时插入序列化器和反序列化器以序列化和反序列化实际数据——这就是应用程序 运行 的全部内容。我如何实现这一切?
    这个问题都是因为我的应用程序没有任何固定的模式。当模式可变时,使用平面缓冲区的一般方法是什么?

我希望我清楚我想问的是什么。如果没有,请告诉我。我很乐意提供更多详细信息。提前感谢您的回答。

答案是你不想要这个。虽然它是可行的,尤其是 C++ 的运行时生成,但将其编译成 DLL 然后将其加载回您的进程是一种极其笨拙的方法。

你的程序的数据结构必须在编译时就知道(如果它是用 C++ 编写的),那么你为什么不能只为它定义一次模式并提前编译它呢?您的程序是否允许用户在运行时 "design" 数据结构?

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

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