当前位置: 首页 > 知识库问答 >
问题:

如何在gRPC调用中直接传递原始二进制文件?

唐炜
2023-03-14

我已经有了protobuf消息对象的proto二进制文件。

现在要进行gRPC调用,我需要将其解组并通过message对象发送到gRPC客户端(该客户端将再次封送相同的对象),这会浪费延迟。

如何通过将二进制文件传递给客户端来避免这种情况?

共有2个答案

咸弘雅
2023-03-14

如果要发送原始二进制数据,请使用字节的protobuf类型,例如。

// .proto file
message MyRawData {
  bytes rawbin = 1;
}

这将在go中转换为字节片,非常适合存储原始二进制:

// go-code
type MyRawData struct {   
    Rawbin []byte   `protobuf:"bytes,1,opt,name=rawbin,proto3" json:"rawbin,omitempty"`
}

汪辰阳
2023-03-14

这可以使用自定义编解码器。自定义编解码器可以定义为

type StubbedCodec struct{}

func (cb StubbedCodec) Marshal(v interface{}) ([]byte, error) {
    return v.([]byte), nil
}

func (cb StubbedCodec) Unmarshal(data []byte, v interface{}) error {
    ba, _ := v.([]byte)

    for index, byte := range data {
        ba[index] = byte
    }
    return nil
}

一旦我们有了这个,我们就可以将编解码器作为拨号选项传递给

grpc.Dial(grpcServer, grpc.WithInsecure(), grpc.WithBlock(), grpc.WithDefaultCallOptions(grpc.ForceCodec(StubbedCodec{})))

这将迫使grpc使用您的编解码器,它基本上什么都不做(如上所述)。

 类似资料:
  • 问题内容: 我正在用Go编写图书馆。我打算分发它,并且主要要求是“ 没有源代码 ”。 为了进行测试,我创建了两个工作区,如下所示, WS1 箱/ pkg / linux_amd64 / lib.a src / lib / src.go WS2 箱/ 公斤/ src / main / main.go 我的第一个工作区(WS1)是实际的虚拟库,它具有一些实用程序功能。第二工作空间(WS2)具有使用WS

  • 我想将上传的文件从多部分/表单数据直接传递到我的DLL函数,而不将其保存为临时文件。 我的c风格DLL函数如下所示: 参数“图像”预计是一个包含jpeg文件完整数据的二进制数组,参数“大小”是“图像”的大小。因为这个数据正是多部分/表单数据的一部分,所以我想提取它,并使用烧瓶和ctype直接将它传递给DLL函数。 但是在我研究了Flask之后,我发现Flask会将多部分/表单数据中的文件提取为文件

  • 问题内容: 为了将二进制文件上传到URL,建议使用本指南。但是,该文件不在目录中,而是存储在MySql db的BLOB字段中。BLOB字段在JPA中映射为属性: 我以这种方式稍微修改了指南中的代码: 我没有使用分块流。使用的标头是: 主机正确接收了所有标头。它还接收上载的文件,但不幸的是,它抱怨该文件不可读,并且断言所接收文件的大小比我的代码输出的大小大37个字节。 我对流,连接和byte []的

  • 我在C中使用SHA512来获取散列值。我是这样做的: 我试图通过以下方式将其转换为十六进制: 但这不是我想要的。 如何将无符号字符中的二进制文件转换为人类可读的格式?打印字符[]的最佳案例。 “数据哈希”的哈希应该是: D98F945FEE6C9055592FA8F398953B3B7CF33A47CFC50667CBCA1ADB344FF18A4F442758810186FB480DA89BC9

  • 我有一个包含编码protobuf数据的coredump,我想解码这个数据并查看内容。我有.proto文件,它在原始协议缓冲区中定义了此消息。我的proto文件如下所示: 和协议版本: 我尝试了以下方法: > 从内核转储原始数据 传给protoc

  • 我需要将react本机应用程序中的图像文件放入预先配置的s3上载URL。我看到了一个fetch示例,它通过path将图像作为二进制文件上传,但它是作为多部分表单上传的。由于s3上传url只能将其作为正文中的原始二进制文件,而不能作为多部分的内容类型,因此使用fetch或react native中的任何其他库将原始二进制图像作为正文使用的语法是什么? 下面的代码将其作为表单数据上传-这不是我想要做的