在官方网站上,有一个很好且相对全面的示例,说明如何使用 CapnProto 进行 C++ 序列化。缺少的是如何处理第二个 Blob 类型capnp::Data
,仅在其中capnp::Text
介绍。
为了完整起见,以下是模式语言对 blob 类型的说明:
Blob:文本、数据
...
文本始终采用 UTF-8 编码并以 NUL 结尾。
数据是完全任意的字节序列。
所以,如果我有以下架构
struct Tiding {
id @0 :Text;
payload @1 :Data;
}
我可以像这样开始构建我的信息
::capnp::MallocMessageBuilder message;
Tiding::Builder tiding = message.initRoot<Tiding>();
tiding.setId("1");
在这一点上,我被卡住了。我不能这样做:
typedef unsigned char byte;
byte data[100];
... //populate the array
tiding.setPayload(data)
//error: no viable conversion from 'byte [100]' to '::capnp::Data::Reader'
所以我稍微搞砸了,看到 capnp::Data 正在包装kj::ArrayPtr<const byte>
,但我无法以某种方式获得一个ArrayPtr
,更不用说使用它来为我的消息设置 Payload 字段了。
我看到有一种方法可以设置类型的默认值Data
(即payload @5 :Data = 0x"a1 40 33";
),但是在这种情况下,模式语言并没有真正转换为 C++,所以这对我也没有帮助。
如果有人能指出我在这里缺少的东西,我将不胜感激。另外,如果我在我的架构中拥有List(Data)
而不是作为有效负载,我将如何做到这一点?Data