首页 > 解决方案 > 如何在 Protocol Buffers 中表示一个二维数组?

问题描述

例如:

[[1,2],[3,4]...]

我只是想测试一下RPC是否支持二维数组,但是有问题,我正在关注官方文档。

服务器如下:

data = [[i, 9] for i in range(128)]


class Greeter(hello_pb2_grpc.GreeterServicer):

    def SayHello(self, request, context):
        return hello_pb2.HelloReply(results=data)


def serve():

    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), options=[
                     (cygrpc.ChannelArgKey.max_send_message_length, -1),
                     (cygrpc.ChannelArgKey.max_receive_message_length, -1)
      ])
    hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    server.add_insecure_port('[::]:50052')
    server.start()
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == '__main__':
    serve()

客户端如下:

def insecure_channel(host, port):
        channel = grpc.insecure_channel(
            target=host if port is None else '%s:%d' % (host, port),
            options=[(cygrpc.ChannelArgKey.max_send_message_length, -1),
                     (cygrpc.ChannelArgKey.max_receive_message_length, -1)])
        return grpc.beta.implementations.Channel(channel)

def run():
    channel = grpc.insecure_channel('localhost:50052')
    stub = hello_pb2_grpc.GreeterStub(channel)
    st = time.time()
    response = stub.SayHello(hello_pb2.HelloRequest(name='test'))
    et = time.time() - st
    print("Greeter client received: {}, {}".format(type(response.results), et))


if __name__ == '__main__':
    run()

protobuf 定义如下

syntax = "proto3";

package hello;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
    repeated Result results = 1;
}

message Result {
    repeated int32 index = 1;
    repeated int32 count = 2;
}

但我得到这样的错误:

  File "greeter_server.py", line 19, in SayHello
    return hello_pb2.HelloReply(results=data)
TypeError: Parameter to MergeFrom() must be instance of same class: expected hello.Result got list.

我正在使用python3。

提前致谢。

标签: protocol-buffersgrpc

解决方案


根据您的问题,[[1,2],[3,4]...]是一个数组数组。

这样的事情应该可以解决您的问题

message InternalArray {
    repeated int internal_array = 1;
}
repeated internal_array array = 1;

推荐阅读