Cap'nProto

时间:2019-05-31 09:09:26

标签: c++ capnproto

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

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

一个配置方案如下:

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

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

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

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

我的问题如下:

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

1 个答案:

答案 0 :(得分:0)

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

关于其他两个问题,这完全取决于您。两种方法都有合法的论据,并且确实取决于具体的用例和您的个人喜好。