c++ - 在 Cap'nProto 中读取/写入配置结构

标签 c++ capnproto

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

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

配置场景如下:

  1. 网络应用要求实际配置(Javascript)

  2. native 应用程序提供实际配置 - 序列化/写入 (C++)

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

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

我的问题如下:

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

最佳答案

要回答您的第二个问题,您可以从 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

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

关于c++ - 在 Cap'nProto 中读取/写入配置结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56392021/

相关文章:

c++ - C++ 为什么以及如何更改旧迭代器的值

c++ - 未定义的行为和顺序点

capnproto - 在 Cap'n Proto 中使用唯一 ID 的示例

rust - 如何设置Cap'n Proto RPC消息遍历限制?

c# - 使用 C# 将非常大的项目列表序列化到 Azure blob 存储中

C++ 将后缀转换为中缀

c++ - 为什么这段代码在调试时慢了 100 倍?

c++ - 生成编译时数组结构 (c++17)

c++ - Cap'n Proto - 将结构反序列化/序列化为 std::string 以存储在 LevelDB 中