0

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

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

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

4

1 回答 1

0

文档对此非常不清楚,我什至不确定我是否正确。

首先,您需要选择要使用的参考形状:“ez”或 struct(尽管您可以将 struct 类型用作 ez?文档根本不讨论这个

如果你使用 ez,你会像这样使用它:

# Client
calculator = client.ez_restore('calculator').cast_as(calculator_capnp.Calculator)

# Server
def restore(ref_id):
    if ref_id == 'calculator':
        return Calculator()
    else:
        raise Exception('Unrecognized ref passed to restore')

server = capnp.TwoPartyServer(sock, restore)

否则,您的引用可以是一个结构,您将使用如下代码:

# Client
calculator = client.restore(calculator_capnp.ObjRef.new_message(id='calculator')).cast_as(calculator_capnp.Calculator)

# Server
class ObjRestorer(calculator_capnp.ObjRef.Restorer):

    def restore(self, objref):
        if objref.id == 'calculator':
            return Calculator()
        else:
            raise Exception('Unrecognized ref passed to restore')

server = capnp.TwoPartyServer(sock, ObjRestorer())

我认为,给定的 RPC 必须具有单一的恢复器样式和类型。你当然不能使用多个结构恢复器。

于 2020-06-02T00:18:41.913 回答