Perfect, it works! Thank you Robert, Pherl and everyone for the help.
On Jul 28, 4:16 pm, Robert <robert.panzer...@googlemail.com> wrote: > Hi, > > I do only create one FileDescriptor instance that contains all message > definitions, because they are all constructed dynamically. > For creating the FileDescriptorProtoBuilder I call: > FileDescriptorProto.Builder fileDescriptorProtoBuilder = > FileDescriptorProto.newBuilder(); > Then I create all the message protos by calling (here A and B): > DescriptorProto.Builder messageProtoBuilderA = > DescriptorProto.newBuilder(); > messageProtoBuilderA.setName( "A" ); > DescriptorProto.Builder messageProtoBuilderB = > DescriptorProto.newBuilder(); > messageProtoBuilderB.setName( "B" ); > > If message A references message B using field f I call: > messageProtoBuilderA.addFieldBuilder() > .setName("f") > .setNumber(2) > .setTypeName("B"); > > Then I add the message protos to the file descriptor: > > fileDescriptorProtoBuilder.addMessageType(messageProtoBuilderA); > > fileDescriptorProtoBuilder.addMessageType(messageProtoBuilderB); > > Finally I create the file descriptor using: > FileDescriptorProto fileDescriptorProto = > fileDescriptorProtoBuilder.build(); > FileDescriptor fileDescriptor = > FileDescriptor.buildFrom(fileDescriptorProto, new FileDescriptor[0]); > > Now I can create concrete messages by calling: > Builder messageA = > DynamicMessage.newBuilder( fileDescriptor.findMessageTypeByName("A") ); > Builder messageB = > DynamicMessage.newBuilder( fileDescriptor.findMessageTypeByName("B") ); > > messageA.setField( > > fileDescriptor.findMessageTypeByName("A").findFieldByName("f"), > messageB.build() ); > > I hope I did not add any errors when abstracting the code and that I > understood your problem correctly. > > Kind regards, > Robert > > On 28 Jul., 14:35, Giancarlo Frison <gfri...@chelab.com> wrote: > > > > > > > > > on the field type descriptor previously create i set name as: > > b2.setName(typename) > > > in the container class (which has reference the b2 field) I setup the > > field as: > > fb = DescriptorProtos.FieldDescriptorProto.newBuilder() > > .setName(fieldName).setNumber(i+ > > +).setLabel(label).setTypeName(typename); > > b1.addField(fb.build()); > > > For creating the b1 descriptor, first I generate the descriptor of b2 > > then: > > d1 = b1.build(); > > fdp1 = > > DescriptorProtos.FileDescriptorProto.newBuilder().addMessageType(d1).build( > > ); > > > but I get an error because fdp1.getDependenciesCount()==0 > > (Descriptors.java:233) Dependencies passed to > > FileDescriptor.buildFrom() don't match those listed in the > > FileDescriptorProto. > > > thrown here: > > dynamicDescriptor = Descriptors.FileDescriptor.buildFrom(fdp1, fds); > > > (fds is array of 1, the b2 descriptor) > > > Why the d1 builder doesn't have the dependency defined adding the > > complex typed field? > > > Thanks!! > > > Ps.: Robert, it's very kind of you whether send me the related > > snippet. Thank you > > > On Jul 27, 8:10 pm, Pherl Liu <liuj...@google.com> wrote: > > > > Take a look at the buildFrom() method. You need to provide an array of > > > FileDescriptor as dependencies. If one of your message field is a complex > > > type, you should build that complex type first, and pass the built > > > FileDescriptor object to the buildFrom() in the dependencies array. > > > > On Wed, Jul 27, 2011 at 7:36 AM, Giancarlo Frison > > > <gfri...@chelab.com>wrote: > > > > > if I call setTypeName(messageName), how protobuf match the name with > > > > related Descriptor? > > > > How can I map messageName and the descriptor of the type? > > > > > On Jul 27, 3:56 pm, Robert <robert.panzer...@googlemail.com> wrote: > > > > > Hi, > > > > > > you either call setType() for primitive types or setTypeName(String) > > > > > for referenced messages. > > > > > You pass in the name of the message. > > > > > > Kind regards, > > > > > Robert > > > > > > On 27 Jul., 10:35, Giancarlo Frison <gfri...@chelab.com> wrote: > > > > > > > Thank you very much Pherl! > > > > > > > An another question. What about not-primitive fields, or message > > > > > > fields? > > > > > > > when I add fields I do: > > > > > > > DescriptorProtos.DescriptorProto.Builder desBuilder > > > > > > .... > > > > > > DescriptorProtos.FieldDescriptorProto.Builder fd1Builder = > > > > > > DescriptorProtos.FieldDescriptorProto.newBuilder() > > > > > > .setName(fieldName).setNumber(i+ > > > > > > +).setType(type).setLabel(label); > > > > > > desBuilder.addField(fd1Builder.build()); > > > > > > > with message typed field I set type as > > > > > > 'DescriptorProtos.FieldDescriptorProto.Type.TYPE_MESSAGE'. How do I > > > > > > describe the field type? > > > > > > I mean, I suppose to describe the field with a inner > > > > > > 'DescriptorProtos.DescriptorProto.Builder', is it correct? How I can > > > > > > do to describe a complex type field? > > > > > > > Thanks! > > > > > > > On Jul 26, 8:21 pm, Pherl Liu <liuj...@google.com> wrote: > > > > > > > > Not sure if I understand your question correctly. You can set the > > > > label in > > > > > > > FieldDescriptorProto: > > > > > > > > LABEL_OPTIONAL = 1; > > > > > > > > LABEL_REQUIRED = 2;LABEL_REPEATED = 3; > > > > > > > > On Tue, Jul 26, 2011 at 12:21 AM, Giancarlo Frison < > > > > gfri...@chelab.com>wrote: > > > > > > > > > There is this example that I'm approaching to re-implement > > > > >http://flori.posterous.com/dynamically-creating-protocol-buffer-objects > > > > > > > > > a question: > > > > > > > > > How to handle repeated fields? How can you describe them in the > > > > > > > > fieldDescriptor? > > > > > > > > > On Jul 18, 5:20 pm, yoave <einavy...@gmail.com> wrote: > > > > > > > > > Hi all, > > > > > > > > > > I've got 2 questions: > > > > > > > > > > 1. how do I generate a Descriptor from a FileDescriptorProto > > > > > > > > > in > > > > Java? > > > > > > > > > In cpp, I'm using DescriptorPool class's 'BuildFile()' > > > > > > > > > functionality. > > > > > > > > > > 2. how do I generate a Dynamic Message from a Descriptor in > > > > > > > > > Java? > > > > > > > > > In cpp, I'm using DynamicMessageFactory class's > > > > 'GetPrototype()' > > > > > > > > > functionality. > > > > > > > > > > thanks > > > > > > > > > -- > > > > > > > > You received this message because you are subscribed to the > > > > > > > > Google > > > > Groups > > > > > > > > "Protocol Buffers" group. > > > > > > > > To post to this group, send email to protobuf@googlegroups.com. > > > > > > > > To unsubscribe from this group, send email to > > > > > > > > protobuf+unsubscr...@googlegroups.com. > > > > > > > > For more options, visit this group at > > > > > > > >http://groups.google.com/group/protobuf?hl=en. > > > > > -- > > > > You received this message because you are subscribed to the Google > > > > Groups > > > > "Protocol Buffers" group. > > > > To post to this group, send email to protobuf@googlegroups.com. > > > > To unsubscribe from this group, send email to > > > > protobuf+unsubscr...@googlegroups.com. > > > > For more options, visit this group at > > > >http://groups.google.com/group/protobuf?hl=en.-Zitierten Text ausblenden > > > >- > > > - Zitierten Text anzeigen - -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to protobuf@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.