2

我正在编写一个简单的客户端服务器来了解 protobuf。
我有以下 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 中的 protobuf 标签没有足够的字段:

奇怪的是,如果我在客户端调用 Unmarshal,它就可以正常工作。
我的 protoc 版本是 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

那么,问题似乎是由于通过套接字发送字节而出现的,但它是具有完全相同值的切片。

4

2 回答 2

2

好的,我解决了。结果是 ReadAll 方法创建了一个最后有一些垃圾的切片(我认为)所以当我这样做的时候

n, err := conn.Read(buffer)
proto.Unmarshal(buffer[:n], &mssg)

它按预期工作!

于 2020-11-17T16:49:12.120 回答
2

如果您遇到此错误并且正在使用github.com/gogo/protobuf,您可能会在此库中遇到一个已知问题,预计不会很快得到解决。解决方法是使用另一个原型库,例如google.golang.org/protobuf/proto

于 2021-09-03T14:22:18.353 回答