Protobuf任何解组



我有一个使用任何类型的原型API

message Document {
DocumentMeta meta = 1;
bytes data = 2;
google.protobuf.Any details = 3;
}

在客户端上,我创建了一个名为Dog的消息,并创建了如下详细信息字段:

dog1 := events2.Dog{
Name: "Leo",
Id:   1,
}
var dst anypb.Any
err = anypb.MarshalFrom(&dst, &dog1, proto.MarshalOptions{})

包含Dog proto的.pb文件也被复制到服务器中。

如果我在服务器中打印文档,它会提供正确的信息

Any:type_url:"type.googleapis.com/com.test.eventbus.pb.events.Dog" value:"nx03Leox10x01"

在服务器端,我在不提供特定proto的情况下进行解组。消息类型(狗(

basicDog, err := anypb.UnmarshalNew(doc.GetDetails(), proto.UnmarshalOptions{})

proto: not found的UnmarshalNew失败

  1. 我在解组过程中不提供特定类型,因为客户端可以发送任何类型的消息,而这些消息可能在应用程序启动时没有定义
  2. 因此,客户端生成一个新的proto文件,为go生成.pb,并将该.go文件复制到服务器中

使用unmarshalAny((方法时,如何在服务器端使用.pb文件?

尝试使用google.protobuf.Value

Proto文件:

syntax = "proto3";
package mediation.common;
option go_package = ".;common";
import "google/protobuf/struct.proto";
message Model {
google.protobuf.Value any = 2;
}

使用:

package common
import (
"encoding/json"
"testing"
"google.golang.org/protobuf/types/known/structpb"
)
type Dog struct {
Id   int
Name string
}
func TestAny(t *testing.T) {
data := map[string]interface{}{
"id":   1,
"name": "kitty",
}
s, _ := structpb.NewValue(data)
newData := s.GetStructValue()
m := Model{Any: structpb.NewStructValue(newData)}
var dog Dog
unmarshal(m.GetAny(), &dog)
t.Log(dog)
var mm map[string]interface{}
unmarshal(m.GetAny(), &mm)
t.Log(mm)
}
func unmarshal(p *structpb.Value, o interface{}) error {
byt, _ := p.MarshalJSON()
return json.Unmarshal(byt, o)
}

最新更新