取消使用已更改的嵌入类型的邮件的合并时出现未知字段错误

给定一个这样的原型:


message Request {

    uint64 account_id = 1;

    message Foo{

        uint64 foo_id = 1;

    }

    repeated Foo foos = 2;


当我添加一个名为bar_id


message Request {

    uint64 account_id = 1;

    message Foo{

        uint64 foo_id = 1;

        uint64 bar_id = 2;

    }

    repeated Foo foos = 2;

我在使用旧的 via 反序列化时遇到错误。错误为 。clientproto.UnmarshalText(msg, request)unknown field name "bar_id" in serviceA.Request_Foo


我知道在proto-3中处理有很多变化,但这不是预期的,因为它似乎违反了向前兼容性(新服务器向旧客户端发送请求)。这是否与使用嵌入式类型有关?在不强制客户端更新的情况下更新服务器的最佳方法是什么?unknown field


不负相思意
浏览 65回答 1
1回答

慕少森

看起来您正在使用已弃用 github.com/golang/protobuf。使用 google.golang.org/protobuf/encoding/prototextUPD:使用丢弃未知(prototext.UnmarshalOptions{DiscardUnknown: true}).Unmarshal(b, msg)pb.proto:syntax = "proto3";// protoc --go_out=. *.protopackage pb;option go_package = "./pb";message RequestOld {    uint64 account_id = 1;    message Foo{        uint64 foo_id = 1;    }    repeated Foo foos = 2;}message RequestNew {    uint64 account_id = 1;    message Foo{        uint64 foo_id = 1;        uint64 bar_id = 2;    }    repeated Foo foos = 2;}功能:import "google.golang.org/protobuf/encoding/prototext"// marshal old messagemsgOld := &pb.RequestOld{    AccountId: 1,    Foos: []*pb.RequestOld_Foo{        {            FooId: 2,        },    },}log.Println("old:", msgOld.String())bOld, err := prototext.Marshal(msgOld)if err != nil {    panic(err)}// unmarshal to new messagemsgNew := &pb.RequestNew{}if err := prototext.Unmarshal(bOld, msgNew); err != nil {    panic(err)}log.Println("new:", msgNew.String())输出:2021/04/07 old: account_id:1  foos:{foo_id:2}2021/04/07 new: account_id:1  foos:{foo_id:2}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go