无法使用协议Buf对字节进行解组 [英] Can't unmarshal bytes using protobuf

查看:20
本文介绍了无法使用协议Buf对字节进行解组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个简单的客户端-服务器来了解protocol buf。
我有以下message.proto文件:

syntax = "proto3"; 
package main;
message Text {
    string name = 1;
    int32 id = 2;
}

这是客户端的代码(忽略的错误):

mssg := &Text{Name: "John Doe", Id: 4721}
bytes, _ := proto.Marshal(mssg)
conn, _ := net.Dial(...)
conn.Write(bytes)

和服务器端:

...
message, _ := ioutil.ReadAll(conn)
mssg := Text{}
err = proto.Unmarshal(message, &mssg)

字节可以很好地通过套接字,但是当我在服务器端调用Unmarshal时,我得到以下错误:

死机:Text.state:

中的协议错误标记字段不足

奇怪的是,如果我在客户端调用Unmarshal,它会工作得很好。
我的协议版本是3.11.2,我是通过

安装的
go get google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go

我创建message.pb.go文件的方式

protoc.exe -I="." --go_out="." message.proto

这样看来,出现问题的原因是通过套接字发送字节,但它是一个具有完全相同值的切片。

推荐答案

如果您遇到此错误并且正在使用github.com/gogo/protobuf,您可能会在此库中遇到一个预计不会很快解决的known issue。解决方法是改用其他原型库,如google.golang.org/protobuf/proto

这篇关于无法使用协议Buf对字节进行解组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆