问题标签 [capnproto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
118 浏览

c++ - Capnp:移动到 BufferedInputStreamWrapper 中的上一个位置

我有一个包含多个 Capnp 消息的二进制文件,我想阅读这些消息。按顺序阅读效果很好,但我有一个用例,我想跳到以前已知的位置。具有元数据的数据顺序图像,包括时间戳。我希望有可能来回跳跃(就像在视频播放器中一样)。

这是我尝试过的:

但我得到这个错误:

我假设tryGetReadBuffer()返回下一个打包消息的位置和大小。但话又说回来,BufferedInputStream 应该如何知道“消息”是什么。

问题:如何获取消息的位置和大小,并稍后从 BufferedInputStreamWrapper 读取这些消息?

替代方案:读取整个文件一次,获取数据的所有权并将其保存到向量中。如此处所述(https://groups.google.com/forum/#!topic/capnproto/Kg_Su1NnPOY)。一直都有更好的解决方案?

0 投票
1 回答
11271 浏览

c++ - Protobuf vs Flatbuffers vs Cap'n proto哪个更快?

我决定找出 Protobuf、Flatbuffers 和 Cap'n proto 中哪一个是我的应用程序最好/最快的序列化。在我的情况下,通过网络发送某种字节/字符数组(我序列化为该格式的原因)。所以我为所有三个都做了简单的实现,我对一个字符串、一个浮点数和一个整数进行了序列化和反序列化。这给出了意想不到的结果:Protobuf 是最快的。我会称它们为意外,因为 cap'n proto 和 flatbuffes “声称”是更快的选择。在我接受这一点之前,我想看看我是否无意中在我的代码中作弊。如果我没有作弊,我想知道为什么 protobuf 更快(确切地说为什么可能是不可能的)。这些消息能否让 cap'n proto 和 faltbuffers 真正让它们发光发热?

我的时间

flatbuffers
所用时间:14162 微秒 capnp 所用时间:60259 微秒
protobuf 所用时间:12131 微秒
(显然这些取决于我的机器,但重要的是相对时间)

平面缓冲区代码

cap'n 原型代码

protobuf 代码

不包括消息定义文件,因为它们很简单并且很可能与它无关。

0 投票
1 回答
37 浏览

python - Python Capn Proto:恢复者?

通读 Cap'n Proto RPC 文档,如果您需要对象引用在多个连接中持久存在,则需要编写恢复器。

在客户端,很清楚如何从中获取写入对象(尽管缺少类型信息使其非常冗长)。

在服务器端,不清楚如何选择你会从中得到什么样的对象?

0 投票
1 回答
102 浏览

c++ - Cap'n'proto过早破坏接口?

假设我有一个这样的流 API:

我遇到了一个挑战,即服务器实现的析构函数MyInterface在最后一个注册接口发布之前运行。如何正确地将关系传达给 cap'n'proto RPC,这样即使客户端MyInterface::Client在 或者,我是否以某种基本方式滥用 API?RegisteredListener::ClientMyInterface::ServerRegisteredListener::Server

C++ 代码大致如下所示。服务器:

客户端代码如下所示:

由于这都是单线程的,因此很容易发现 use-after-free。我将调试语句放入~MyInterfaceImpl并且~RegisteredListener第二个侦听器在~MyInterfaceImpl. 我知道我的添加侦听器请求没有实际的客户端对象,但我希望这实际上不是一个重要的细节。

0 投票
1 回答
355 浏览

c++ - 如何将 Cap'n'Proto 线程与非 Cap'n'Proto 线程集成?

如何将 Cap'n'Proto 客户端使用与周围的多线程代码正确集成?Cap'n'Proto 文档说每个 Cap'n'Proto 接口都是带有专用事件循环的单线程。此外,他们建议使用 Cap'n'Proto 在线程之间进行通信。但是,文档似乎没有描述非 Cap'n'Proto 线程(例如 UI 循环)如何与之集成。即使可以在某些地方将 Cap'n'Proto 事件循环与 UI 循环集成,其他模型如线程池(Android Binder、全局 libdispatch 队列)似乎更具挑战性。

认为解决方案是将客户端线程的线程执行器缓存在非 capnp 线程将访问它的同步位置。

我相信虽然调用线程总是需要在自己的事件循环中才能与它们结合,但我只是想确保情况确实如此。我最初尝试在一个简单的单元测试中这样做失败了。我创建了一个 KjLooperEventPort 类(遵循节点 libuv 适配器的结构)以在 Android 上结合 KJ 和 ALooper。

然后我的测试代码是:

这会崩溃履行返回给 kj 线程的承诺。

0 投票
1 回答
226 浏览

python - Python如何将capnproto转换为json?

我在 Postgress 数据库中有一些带有 capnp 二进制数据的遗留物,我想将其转换为 jsonb

python 中有没有现成的解决方案可以将数据从 capnp 转换为 json ?

0 投票
1 回答
134 浏览

c++ - VS2019:编译 Cap'nProto 使 C++ 编译器崩溃

因此,情况是由于一些不可预见的后果,我需要使用 Visual Studio 2019(据我所知的最新版本,16.7.3)为 Windows构建 Cap'nProto( https://capnproto.org/ )。

正如您从下面的屏幕截图中看到的那样,编译器对代码非常不满意,以至于它在第 2616 行给出了内部编译器错误,其中有一个非常复杂的宏扩展为自动模板噩梦。

错误截图

宏本身是:

我的第一次尝试是手动修复此事件(以及此文件中的下一个事件,其中包含在 for 之外提取两个变量定义的行,并添加一对额外的范围(实际上不触及宏)但下一个编译阶段显示,可悲的是,这个宏实际上在应用程序的任何地方都使用了。顺便说一句,这个策略奏效了,编译器不再崩溃了。

但是由于战略性地设置了恶意中断,(很容易)按照上述策略重写宏被证明比我想象的要困难一些。

现在,我可以报告错误并等待 Microsoft 修复它的编译器,但是考虑到我需要这个编译器......昨天这不是一个选项。

Capnproto 在他们的网站 ( https://capnproto.org/install.html#supported-compilers ) 上声称他们支持 Visual Studio 2017,遗憾的是这对我来说也不是一个选择。

我选择的另一个解决方案是询问社区是否有人对如何重写该宏有任何其他想法,以便稍微扰乱宏生成的代码,而它仍然具有相同的含义,只是表达方式不同(我尝试添加更多变量,**dummy = &kj_switch_done但它仍然会导致编译器崩溃)。

有任何想法吗?

0 投票
1 回答
39 浏览

capnproto - 调用 `thisCap()` 段错误

我正在使用calculator-server.c++示例,我尝试从中提取thisCap()以从外部访问服务器的功能。因为thisCap()protected,我写了自己的公众号getCapability()

然后我创建服务器并getCapability()从我的主服务器调用:

但是这个段错误:

按照源代码,我最终得到了这个

所以它似乎thisHook是一个 nullptr,这是有道理的,因为这就是它的初始化方式

我只是不知道它在什么时候被初始化(解释了它何时绝对没有被初始化)。

任何的想法?

0 投票
0 回答
60 浏览

rust - 如何解决此错误:错误[E0277]:不满足特征绑定`SocketStream:std :: io :: Read`?

这是代码体。我正在使用 capnp::rpc 版本 0.8.3。“ std::io::Read SocketStream`std::io::Write没有实现该特征”我想我需要以某种方式将std::io::Read和Write添加到我创建的流中。我怎样才能做到这一点?SocketStream " "the trait is not implemented for

0 投票
1 回答
125 浏览

python - 如何正确关闭船长原型结构以避免内存泄漏?

我想我有内存问题,我想关闭我使用 pycapnp 读取的文件。最好的方法是如何做到这一点?是在做:

在我的场景中,我有一个以 captian proto 格式保存的数据集,我想在从中提取我需要的信息后关闭 Captain proto 文件(以避免内存问题而不是浪费空间!)。这样做的正确方法是什么,

.finish()

方法保证做到这一点?我不必打电话给垃圾收集器……对吧?

提前致谢!

参考: