c++ - Cap'nProto 中的读/写配置结构
问题描述
我有一个 C++ 嵌入式应用程序,我想创建一个 Web 界面来配置它。
我的计划是在 Cap'nProto 中描述配置结构,然后在 C++ 和 Javascript 端使用生成的代码。
配置场景如下:
网络应用程序要求实际配置(Javascript)
本机应用程序服务于实际配置 - 序列化/写入(C++)
- Web 应用程序在反序列化/读取 (Javascript) 后显示实际配置
- 用户可以在 Web 应用程序中修改配置 - 如何?(Javascript)
- Web 应用程序发回新配置 - 序列化/写入 (Javascript)
- 本机应用程序在反序列化/读取 (C++) 后使用新配置
- 本机应用程序可以修改配置 - 如何?(C++)
4和7是棘手的部分,因为据我了解API我只能反序列化只读阅读器,但是我想稍后修改和重新序列化它。
我的问题如下:
- 所描述的场景是做我想做的最好的方法还是我应该做一些完全不同的事情?
- 我可以反序列化构建器吗?或以某种方式将阅读器转变为构建器(无需复制)
- 我应该使用生成的 C++ / Javascript 结构作为配置的直接来源(实际代码 <-> Cap'nProto 结构)还是应该引入“本机”结构与之交互(实际代码 <-> “本机”结构 <-> (序列化/反序列化)Cap'nProto 结构)
解决方案
要回答您的第二个问题,您可以从 Reader 初始化 Builder,例如:
fooBulider.setBar(someBarReader);
或者对于顶级 MessageReader/MessageBuilder:
messageBuilder.setRoot<RootType>(messageReader.getRoot<RootType>());
这确实需要一个副本,但对于您的用例,该副本可能没什么大不了的。配置通常不是数千兆字节的文件,也不是性能敏感的。
理论上,还可以创建一个直接从现有消息数据初始化的 MessageBuilder,然后就地修改。但是,这有一些主要的警告。看:
关于你的另外两个问题,这真的取决于你。两种方式都有合理的论据,这实际上取决于具体的用例和您的个人品味。
推荐阅读
- python - 试图理解python中二叉树(递归函数)中存在的节点
- python - 消息:Python Selenium 中的元素不可交互
- c++ - 按第一个值对c ++中的二维数组进行排序
- python - 如何在python中使用带有2个数据框的函数
- html - 验证码解决服务如何将我的验证码加载给他们的工作人员
- react-redux - react-redux 钩子中的顺序调度操作
- flutter - Flutter:如何在 Wrap 小部件中将容器大小设置为 wrap_content
- swiftui - SwiftUI 更改显示在操作表中的状态
- flutter - RenderView 中的 Window 参数所需的值是多少
- reactjs - Reactjs:FirebaseError:消息:我们无法注册默认服务工作者