【问题标题】:How to use flat buffers when the schema is not fixed?架构不固定时如何使用平面缓冲区?
【发布时间】:2019-01-25 09:52:48
【问题描述】:

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

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

现在,我打算使用平面缓冲区来序列化和反序列化数据(因为它的明显优势 - 随机访问和向后兼容性)。
但是,要做到这一点,我需要在某些方面澄清并希望对它们有所帮助。

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

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

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

【问题讨论】:

    标签: c++ serialization deserialization ipc flatbuffers


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复。数据结构在编译时是未知的。这个特定上下文中的程序实际上是一个 DLL。因此,DLL 的入口点获取数据和相应的构造自定义数据类型。 DLL 为应用程序公开了一系列函数,以便能够构建该类型。因此,根据值类型,DLL 的用户应用程序构造自定义类型,然后调用 DLL 并传递数据和自定义类型。 DLL 然后序列化数据和自定义类型。我打算在 DLL 中使用 Flat Buffer 进行序列化。
    猜你喜欢
    • 2022-12-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多