【问题标题】:Reading/writing config struct in Cap'nProtoCap'nProto 中的读/写配置结构
【发布时间】:2019-05-31 09:09:26
【问题描述】:

我有一个 C++ 嵌入式应用程序,我想创建一个 Web 界面来配置它。

我的计划是在 Cap'nProto 中描述配置结构,然后在 C++ 和 Javascript 端使用生成的代码。

配置场景如下:

  1. Web 应用程序要求提供实际配置 (Javascript)

  2. 本机应用程序服务于实际配置 - 序列化/写入 (C++)

  3. Web 应用在反序列化/读取 (Javascript) 后显示实际配置
  4. 用户可以在 Web 应用程序中修改配置 - 如何? (Javascript)
  5. Web 应用发回新配置 - 序列化/写入 (Javascript)
  6. 本机应用在反序列化/读取 (C++) 后使用新配置
  7. 本机应用程序可以修改配置 - 如何? (C++)

4 和 7 是棘手的部分,因为据我了解 API,我只能反序列化只读阅读器,但是我想稍后对其进行修改和重新序列化。

我的问题如下:

  • 所描述的场景是做我想做的事情的最佳方法还是我应该做一些完全不同的事情?
  • 我可以反序列化构建器吗?或者以某种方式将读者转变为构建者(无需复制)
  • 我应该使用生成的 C++/Javascript 结构作为配置的直接来源(实际代码 Cap'nProto 结构)还是应该引入“本机”结构以与之交互(实际代码 “本机”结构(序列化/反序列化)Cap'nProto 结构)

【问题讨论】:

    标签: c++ capnproto


    【解决方案1】:

    要回答您的第二个问题,您可以从 Reader 初始化 Builder,例如:

    fooBulider.setBar(someBarReader);
    

    或者对于顶级 MessageReader/MessageBuilder:

    messageBuilder.setRoot<RootType>(messageReader.getRoot<RootType>());
    

    这确实需要一个副本,但对于您的用例,该副本可能没什么大不了的。配置通常不是数 GB 的文件,也不对性能敏感。

    理论上,还可以创建一个直接从现有消息数据初始化的 MessageBuilder,然后就地修改。但是,这有一些主要的警告。见:

    https://github.com/capnproto/capnproto/blob/3aa2b2aa02edb1c160b154ad74c08c929a02512a/c++/src/capnp/message.h#L168-L187

    关于您的其他两个问题,这完全取决于您。两种方式都有合理的论据,这实际上取决于具体的用例和您的个人品味。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2011-08-30
      • 2018-11-13
      相关资源
      最近更新 更多