协议缓冲区:通过GRPC

时间:2018-12-26 12:33:20

标签: go protocol-buffers marshalling grpc

我的目标是创建一个API,该API接收JSON对象(嵌套和任意性质),将它们打包为google/protobuf/struct.proto结构,并使用GRPC发送它们。没问题,好的jsonpb库涵盖了解组过程。

问题出现在GRPC服务器(接收方)中,它将struct.proto对象解压缩为普通的golang数据结构,以方便使用,因此它与其他各种嵌套对象一起成为map[string]interface{}

因此,当我尝试将对象转换回struct.proto并将其发送回客户端时,几乎没有选择。我发现一个使用反射的转换器,该转换器有一个我无法完全捕捉到的错误(与无法区分数据类型有关,它把嵌套的东西视为接口{}),this one

敲了好几个小时之后,我开始怀疑这是否是最好的方法。我需要将struct.proto对象转换为方便的对象,然后再转换回去,是否有更好的方法在保持嵌套功能的同时尽可能快地进行转换?

奇怪的是,struct.proto易于转换为一种方式,而很难进行相反的转换。必须是因为提取对象元数据的唯一方法是通过反射。而且缺少泛型使其更加困难。

使用JSON会降低性能,并且gob并不是一个选择,因为该协议必须尽可能通用。我能想到的最后一次机会是找到另一个编组器,并通过protobuf将数据作为原始字节发送,然后在服务器中将其解组。

欢迎您的帮助,谢谢。

编辑1:

我认为最终我将不得不实现在protobuf定义中具有多个编组协议和字节数组的可能性,因此服务器和客户端将以他们可以支持的最快速度进行协商……这将使我能够使用gob和jbson作为后备实现。有评论吗?

1 个答案:

答案 0 :(得分:0)

grpc服务器应将字节解包到定义为here的go结构中。您能否提供有关为什么看到map[string]interface{}的更多信息?