我有一个C++嵌入式应用程序,我想创建一个Web界面来配置它。
我的计划是在Cap'nProto中描述配置结构,然后在C++和Javascript端使用生成的代码。
配置方案如下:
-
Web应用程序要求实际配置(Javascript)
-
本机应用程序提供实际配置 - 序列化/写入 (C++)
- Web 应用程序在反序列化/读取后显示实际配置 (Javascript)
- 用户可以在 Web 应用程序中修改配置 - 如何?(Javascript)
- Web 应用程序发回新配置 - 序列化/写入 (Javascript)
- 本机应用程序在反序列化/读取后使用新配置 (C++)
- 本机应用程序可以修改配置 - 如何?(C++)
4 和 7 是棘手的部分,因为据我了解 API,我只能反序列化只读的读取器,但我想稍后修改并重新序列化它。
我的问题如下:
- 所描述的场景是做我想做的事的最佳方法,还是我应该做一些完全不同的事情?
- 是否可以反序列化生成器?或者以某种方式将读者转变为构建者(无需复制)
- 我应该使用生成的C++/Javascript结构作为配置的直接来源(实际代码<->Cap'nProto结构),还是应该引入"本机"结构进行交互(实际代码<->"本机"结构<->(序列化/反序列化)Cap'nProto结构 )
要回答第二个问题,您可以从读取器初始化构建器,例如:
fooBulider.setBar(someBarReader);
或者对于顶级 MessageReader/MessageBuilder:
messageBuilder.setRoot<RootType>(messageReader.getRoot<RootType>());
这确实需要一个副本,但对于您的用例,该副本可能没什么大不了的。配置通常不是多千兆字节的文件,也不对性能敏感。
理论上,也可以创建一个 MessageBuilder,该 MessageBuilder 直接从现有消息数据初始化,然后就地修改这些数据。但是,这有一些主要的警告。看:
https://github.com/capnproto/capnproto/blob/3aa2b2aa02edb1c160b154ad74c08c929a02512a/c++/src/capnp/message.h#L168-L187
关于你的另外两个问题,这真的取决于你。两种方式都有合理的论据,它实际上将归结为特定的用例和您的个人品味。