为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
不负相思意 2022-08-24 12:52:31
给定一个这样的原型:message Request {    uint64 account_id = 1;    message Foo{        uint64 foo_id = 1;    }    repeated Foo foos = 2;当我添加一个名为bar_idmessage 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
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

看起来您正在使用已弃用 github.com/golang/protobuf。使用 google.golang.org/protobuf/encoding/prototext


UPD:使用丢弃未知


(prototext.UnmarshalOptions{DiscardUnknown: true}).Unmarshal(b, msg)

pb.proto:


syntax = "proto3";


// protoc --go_out=. *.proto


package 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 message

msgOld := &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 message

msgNew := &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}


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信