Inverse of ToDescriptorProto?

41 views
Skip to first unread message

Bob Glickstein

unread,
Jul 8, 2020, 12:37:49 PM7/8/20
to Protocol Buffers
In Go, using google.golang.org/prot...@v1.25.0, I can turn a proto.Message m into a serialized description of its type like this:

ref := m.ProtoReflect()
desc
:= ref.Descriptor()
descProto
:= protodesc.ToDescriptorProto(desc)
proto
.Marshal(descProto)

I would like to take a serialized type t like this and turn it back into a (blank) proto.Message of the appropriate type. (Error checks etc. omitted for clarity.)

var descProto descriptorpb.DescriptorProto
err
:= proto.Unmarshal(t, &descProto)
desc
:= ThisOperationDoesNotExist(&descProto) // The problem.
m
:= dynamicpb.NewMessage(desc)

I've been able to make ThisOperationDoesNotExist work by faking up a FileDescriptorSet, like this:

descProtos := []*descriptorpb.DescriptorProto{&descProto}
name
:= "x"
fdProtos
:= []*descriptorpb.FileDescriptorProto{{Name: &name, MessageType: descProtos}}
fdSet
:= &descriptorpb.FileDescriptorSet{File: fdProtos}
f
, err := protodesc.NewFiles(fdSet)
&descriptorpb.FileDescriptorSet{File: []*descriptorpb.FileDescriptorProto{{Name: &name, MessageType: []*descriptorpb.DescriptorProto{&dp}}}})

var desc protoreflect.MessageDescriptor
f
.RangeFiles(func(fileDesc protoreflect.FileDescriptor) bool {
  msgDescs
:= fileDesc.Messages()
  desc
= msgDescs.Get(0)
})

but that's pretty ugly, and probably brittle. Is there another way? And if there isn't, can one be added?

Thanks,
- Bob

Bob Glickstein

unread,
Jul 8, 2020, 1:46:02 PM7/8/20
to Protocol Buffers
On Wed, Jul 8, 2020 at 9:37 AM Bob Glickstein <bob.gli...@gmail.com> wrote:
I've been able to make ThisOperationDoesNotExist work by faking up a FileDescriptorSet, like this:

Copy-paste error in my original message, sorry. It should be:
 
descProtos := []*descriptorpb.DescriptorProto{&descProto}
name
:= "x"
fdProtos
:= []*descriptorpb.FileDescriptorProto{{Name: &name, MessageType: descProtos}}
fdSet
:= &descriptorpb.FileDescriptorSet{File: fdProtos}
f
, err := protodesc.NewFiles(fdSet)
var desc protoreflect.MessageDescriptor
f
.RangeFiles(func(fileDesc protoreflect.FileDescriptor) bool {
  msgDescs
:= fileDesc.Messages()
  desc
= msgDescs.Get(0)
})

Cheers,
- Bob
Reply all
Reply to author
Forward
0 new messages