1. I have created a generic API using Any field. Clients can define any new
message in a proto file, and send the data using this API in Any field. The
client also shares the proto file to the server beforehand.
Input for API:
message Document {
DocumentMeta meta = 1;
bytes data = 2;
google.protobuf.Any details = 3;
}
2. On server-side, I am trying to register the new MessageType from the
shared .proto file in protoregistry.GlobalTypes.
tmp_file := filename + "tmp.pb"
cmd := exec.Command("protoc","--descriptor_set_out=" + tmp_file,
"-I"+src_dir,path.Join(src_dir,
filename))
protoFile, err := ioutil.ReadFile(tmp_file)
pb_set := new(descriptorpb.FileDescriptorSet)
if err := proto.Unmarshal(protoFile, pb_set); err != nil {
return err
}
pb := pb_set.GetFile()[0]
fd, err := protodesc.NewFile(pb, protoregistry.GlobalFiles)
if err = protoregistry.GlobalFiles.RegisterFile(fd); err != nil {
return err
}
msgType = dynamicpb.NewMessageType(fd.Messages().Get(0))
err = protoregistry.GlobalTypes.RegisterMessage(msgType)
This works fine. Eg: On client side, I created a message named Dog. After
registering, I print GlobalTypes in server and it lists
com.test.eventbus.pb.events.Dog
3. From the API input, I convert the Any type to a proto.Message as follows
basic, err := anypb.UnmarshalNew(doc.GetDetails(), proto.UnmarshalOptions{})
UnmarshalNew uses protoregistry.GlobalTypes as default resolver and that is
why I am registering Dog type in GlobalTypes
4. From the proto.Message type in step 3 (basic), I want to obtain the
schema of the message.
msgV1 := proto.MessageV1(basic)
desc, err := desc.LoadMessageDescriptorForMessage(msgV1)
This fails in LoadMessageDescriptorForMessage with error
error interface conversion: *dynamicpb.Message is not desc.protoMessage:
missing method Descriptor
It seems to me either there is some error in Type registration or
unmarshalling of actual data. Can someone point out the right way to do
this?
Regards
--
You received this message because you are subscribed to the Google Groups
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/grpc-io/ad7a12e1-4cc7-435b-9230-6ea3cb7f2a1dn%40googlegroups.com.