Reading/writing Cap'nProto 中的配置结构
Reading/writing config struct in Cap'nProto
我有一个 C++ 嵌入式应用程序,我想创建一个 Web 界面来配置它。
我的计划是在 Cap'nProto 中描述配置结构,然后在 C++ 和 Javascript 端使用生成的代码。
配置方案如下:
网络应用要求实际配置 (Javascript)
本机应用程序提供实际配置 - serialization/write (C++)
- Web 应用在 deserialization/read (Javascript)
之后显示实际配置
- 用户可以修改 Web 应用程序中的配置 - 如何? (Javascript)
- 网络应用发回新配置 - serialization/write (Javascript)
- 本机应用程序在 deserialization/read (C++)
之后使用新配置
- 本机应用程序可以修改配置 - 如何? (C++)
4 和 7 是棘手的部分,因为据我了解 API 我只能反序列化只读的 reader,但是我想修改并重新序列化稍后。
我的问题如下:
- 描述的场景是做我想做的事情的最佳方法还是我应该做一些完全不同的事情?
- 我可以反序列化构建器吗?或者以某种方式将 reader 转换为构建器(无需复制)
- 我应该使用生成的 C++ / Javascript 结构作为配置的直接来源(实际代码 <-> Cap'nProto 结构)还是我应该引入 "native" 结构来与之交互(实际代码 <-> "native" 结构 <->(serialize/deserialize) Cap'nProto 结构)
要回答您的第二个问题,您可以从 Reader 初始化一个 Builder,例如:
fooBulider.setBar(someBarReader);
或 top-level MessageReader/MessageBuilder:
messageBuilder.setRoot<RootType>(messageReader.getRoot<RootType>());
这确实需要一个副本,但对于您的用例,该副本可能没什么大不了的。配置通常不是 multi-gigabyte 文件,也不是 performance-sensitive.
理论上,也可以创建直接从现有消息数据初始化的 MessageBuilder,然后修改 in-place。但是,这有一些重要的警告。参见:
关于你的其他两个问题,完全取决于你。两种方式都有合理的论点,这将真正归结为特定的用例和您的个人品味。
我有一个 C++ 嵌入式应用程序,我想创建一个 Web 界面来配置它。
我的计划是在 Cap'nProto 中描述配置结构,然后在 C++ 和 Javascript 端使用生成的代码。
配置方案如下:
网络应用要求实际配置 (Javascript)
本机应用程序提供实际配置 - serialization/write (C++)
- Web 应用在 deserialization/read (Javascript) 之后显示实际配置
- 用户可以修改 Web 应用程序中的配置 - 如何? (Javascript)
- 网络应用发回新配置 - serialization/write (Javascript)
- 本机应用程序在 deserialization/read (C++) 之后使用新配置
- 本机应用程序可以修改配置 - 如何? (C++)
4 和 7 是棘手的部分,因为据我了解 API 我只能反序列化只读的 reader,但是我想修改并重新序列化稍后。
我的问题如下:
- 描述的场景是做我想做的事情的最佳方法还是我应该做一些完全不同的事情?
- 我可以反序列化构建器吗?或者以某种方式将 reader 转换为构建器(无需复制)
- 我应该使用生成的 C++ / Javascript 结构作为配置的直接来源(实际代码 <-> Cap'nProto 结构)还是我应该引入 "native" 结构来与之交互(实际代码 <-> "native" 结构 <->(serialize/deserialize) Cap'nProto 结构)
要回答您的第二个问题,您可以从 Reader 初始化一个 Builder,例如:
fooBulider.setBar(someBarReader);
或 top-level MessageReader/MessageBuilder:
messageBuilder.setRoot<RootType>(messageReader.getRoot<RootType>());
这确实需要一个副本,但对于您的用例,该副本可能没什么大不了的。配置通常不是 multi-gigabyte 文件,也不是 performance-sensitive.
理论上,也可以创建直接从现有消息数据初始化的 MessageBuilder,然后修改 in-place。但是,这有一些重要的警告。参见:
关于你的其他两个问题,完全取决于你。两种方式都有合理的论点,这将真正归结为特定的用例和您的个人品味。