在 protobuf 中通过引用传递参数
Pass a parameter by reference in protobuf
我正在编写一个 proto
文件来实现 gRPC
服务,它的合同需要与我现有的 WCF
服务之一相同。 WCF
服务有一个定义如下的操作契约:
[OperationContract]
public ResponseObject Calculate(string value, ref List<string> warnings)
我正在尝试在 protobuf
中执行相同的实现。这就是我所拥有的 rpc
和消息:
rpc Calculate(RequestMessage) returns (ResponseObject)
message RequestMessage{
string value = 1;
repeated string warnings = 2;
//there is no equivalent to pass by reference types 'ref'
}
正如你在上面看到的,我知道我们可以使用 protobuf
中的重复类型来表示一个列表,但是是否有支持的方法来使用对类型的引用传递?在上面的操作中,我必须进行计算并直接更新引用列表。有没有办法在 protobuf
中做类似的事情?我试图浏览文档,但没有找到执行此操作的方法。
No-yes.
您不能使用协议缓冲区共享机器内存引用。
协议缓冲区定义了可以跨语言(运行时)和机器类型实现的抽象类型,并且通常(不总是)在不同机器上的多个进程 运行 之间实现。由于这些原因,共享内存 (!) 引用将很困难并且可能毫无意义。
但是您可以使用标识符来表示类型的实例。当一个节点创建类型时,每个类型都可以使用一些唯一标识符被其他节点引用。然后,对等点必须维护这些引用的列表或能够查找它们,但标识符然后可以通过例如以引用列表的形式连接到远程对等点的网络;可移植的唯一标识符而不是 machine-specific 内存引用。
我正在编写一个 proto
文件来实现 gRPC
服务,它的合同需要与我现有的 WCF
服务之一相同。 WCF
服务有一个定义如下的操作契约:
[OperationContract]
public ResponseObject Calculate(string value, ref List<string> warnings)
我正在尝试在 protobuf
中执行相同的实现。这就是我所拥有的 rpc
和消息:
rpc Calculate(RequestMessage) returns (ResponseObject)
message RequestMessage{
string value = 1;
repeated string warnings = 2;
//there is no equivalent to pass by reference types 'ref'
}
正如你在上面看到的,我知道我们可以使用 protobuf
中的重复类型来表示一个列表,但是是否有支持的方法来使用对类型的引用传递?在上面的操作中,我必须进行计算并直接更新引用列表。有没有办法在 protobuf
中做类似的事情?我试图浏览文档,但没有找到执行此操作的方法。
No-yes.
您不能使用协议缓冲区共享机器内存引用。
协议缓冲区定义了可以跨语言(运行时)和机器类型实现的抽象类型,并且通常(不总是)在不同机器上的多个进程 运行 之间实现。由于这些原因,共享内存 (!) 引用将很困难并且可能毫无意义。
但是您可以使用标识符来表示类型的实例。当一个节点创建类型时,每个类型都可以使用一些唯一标识符被其他节点引用。然后,对等点必须维护这些引用的列表或能够查找它们,但标识符然后可以通过例如以引用列表的形式连接到远程对等点的网络;可移植的唯一标识符而不是 machine-specific 内存引用。