gpt4 book ai didi

c++ - 架构不固定时如何使用 FlatBuffers ?

转载 作者:行者123 更新时间:2023-11-28 04:25:51 26 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

答案是您不希望这样。虽然它是可行的,尤其是 C++ 的运行时生成,但将其编译成 DLL 然后将其加载回您的进程是一种极其笨拙的实现方式。

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

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

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

关于c++ - 架构不固定时如何使用 FlatBuffers ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54362759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com