【问题标题】:What is the correct way to send binary data using protocol buffers?使用协议缓冲区发送二进制数据的正确方法是什么?
【发布时间】:2016-04-22 09:38:25
【问题描述】:

使用protogen工具后,我有一个用于发送消息的消息类型:

type File struct {
    Info string `protobuf:"bytes,1,opt,name=info,json=info" json:"info,omitempty"`
    BytesValues []byte  `protobuf:"bytes,2,opt,name=bytes_values,json=bytesValues,proto3" json:"bytes_values,omitempty"`
}

我正在尝试使用BytesValues 字段发送一些二进制数据,如下所示:

filePath := filepath.Join("test", "myfile.bin")

f, _ := ioutil.ReadFile(filePath) // error return value ignored for brevity

msg := File{BytesValues: f}

body, _ := proto.Marshal(msg) // encode

服务器似乎在解码我发送给它的消息时出现问题。这是使用带有协议缓冲区的[]byte 字段发送二进制数据的正确方法吗?

【问题讨论】:

  • 不使用protobuf发送大量数据会破坏使用protobuf的实际目的吗?如何在 protobuf 中编码 RPC 套接字信息,并让服务使用它来传输文件?
  • 服务器的响应是什么?
  • @eduncan911我的双手被束缚在这个服务器上,因为我尝试与之通信的服务器是 Avatica(Apache Calcite 的一部分),它被 Apache Phoenix 查询服务器使用。
  • @Sean Server 响应成功,但二进制数据未插入表中。除非我向消息中添加数据的方式有问题,否则我认为这可能是 Avatica 的问题。我已经联系了开发人员,他们正在调查。
  • 您确定要将 Info 的 protobuf 类型设为 bytes 吗?只看类型对应,我就预料到string

标签: go protocol-buffers


【解决方案1】:

在我的例子中,问题实际上是服务器没有从正确的字段中读取原始字节。

发送原始字节的正确方法是将字节设置到字段中。无需以任何方式对字节进行编码,因为协议缓冲区是二进制格式。

filePath := filepath.Join("test", "myfile.bin")

f, _ := ioutil.ReadFile(filePath) // error return value ignored for brevity

msg := File{BytesValues: f}

body, _ := proto.Marshal(msg) // encode

【讨论】:

  • 这两个代码sn-ps(一问一答)是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多