What are you still missing? The code you've written ought to work after changing to pass the correct FileDescriptor object to DynamicMessage.
On Fri, Jun 24, 2011 at 12:27 AM, slookin <sloo...@gmail.com> wrote: > Yes, in generally it is not Self Describing, but couldn't implement > real self describing, becase the message size. > But I'm able upload proto descripter to reciver, so I want to parse > incomming message using proto descripter. > Could you help me, how I can do it? > > On Jun 23, 8:12 pm, Jason Hsueh <jas...@google.com> wrote: > > Oh, I missed that you were reading the FileDescriptorSet from a separate > > file, not the same stream. This isn't exactly "self describing" since > when > > you transmit the message you assume the recipient knows what type the > > message is, and has access to the FileDescriptorSet. Seehttp:// > code.google.com/apis/protocolbuffers/docs/techniques.html#self... > > > > > > > > > > > > > > > > On Thu, Jun 23, 2011 at 12:31 AM, slookin <sloo...@gmail.com> wrote: > > > Thanks Jason, > > > It is all my code (link to real java class - > > >http://test.look-in.net/pf/pf.zip. > > > Could you give me links with examples or explain why i should > > > "serializes the FileDescriptorSet"? > > > > > On Jun 22, 8:35 pm, Jason Hsueh <jas...@google.com> wrote: > > > > On Wed, Jun 22, 2011 at 3:30 AM, slookin <sloo...@gmail.com> wrote: > > > > > I trying to develop "flexible" server for reciving message, i'm not > > > > > able to create java classes for each message type, but I can upload > > > > > proto descripter on server. Of course client (sender) will use > > > > > generated java classes for prepare messages: > > > > > > > My code (sender): > > > > > Person.Builder person = Person.newBuilder(); > > > > > person.setId(Integer.valueOf(42)); > > > > > person.setEmail("test_em...@gmail.com"); > > > > > person.setName("Viktor Villari"); > > > > > Person p=person.build(); > > > > > FileOutputStream fstream = new FileOutputStream ("message.pf"); > > > > > CodedOutputStream outSream = > CodedOutputStream.newInstance(fstream); > > > > > p.writeTo(outSream); > > > > > outSream.flush(); > > > > > System.out.println("sent"); > > > > > > > Reciver (address.descriptor.proto - grenerated via > descriptor.proto): > > > > > FileInputStream input = new FileInputStream > > > > > ("address.descriptor.proto"); > > > > > DescriptorProtos.FileDescriptorSet > > > > > fdsProto=DescriptorProtos.FileDescriptorSet.parseFrom(input); > > > > > input = new FileInputStream ("message.pf"); > > > > > // > > > > > System.out.println(fds.getFile(0).getMessageType(0).getName()); > > > > > System.out.println("File name = > > > > > "+fdsProto.getFile(0).getName()); > > > > > // System.out.println("Message type = > > > > > "+fdsProto.getFile(0).getMessageType(0).getName()); > > > > > // System.out.println("Field info = > > > > > "+fdsProto.getFile(0).getMessageType(0).getField(0).getName()+" > > > > > "+fdsProto.getFile(0).getMessageType(0).getField(0).getType()); > > > > > FileDescriptor > > > > > fileDescr=FileDescriptor.buildFrom(fdsProto.getFile(0), new > > > > > FileDescriptor[0]); > > > > > System.out.println("Message type = > > > > > "+fileDescr.getMessageTypes().get(0).getName()); > > > > > System.out.println("Field info = > > > > > "+fileDescr.getMessageTypes().get(0).getFields().get(0).getName()+" > > > > > type= > > > > > "+fileDescr.getMessageTypes().get(0).getFields().get(0).getType()); > > > > > DynamicMessage > > > > > dm=DynamicMessage.parseFrom(fdsProto.getDescriptor(), > > > > > input); > > > > > > On this line, you are passing the descriptor for the > FileDescriptorSet. > > > You > > > > should be using fileDescr to get at the Person message type. (Note > that > > > your > > > > description scheme does not indicate what message type is actually > used. > > > But > > > > I also don't see the code snippet that serializes the > FileDescriptorSet, > > > or > > > > for that matter delimit between the FileDescriptorSet and the > serialized > > > > Person data, so maybe you are doing something elsewhere) > > > > > > > System.out.println("DynamicMessage to string > > > > > \n"+dm.toString()); > > > > > //---- problem line > > > > > System.out.println("Person.name = "+ > > > > > > dm.getField(fileDescr.getMessageTypes().get(0).getFields().get(0))); > > > > > //---- > > > > > > > Output: > > > > > File name = addressbook.proto > > > > > Message type = Person > > > > > Field info = name type= STRING > > > > > DynamicMessage to string > > > > > 2: "Viktor Villari" > > > > > 3: 42 > > > > > 4: "test_em...@gmail.com" > > > > > > > Exception in thread "main" java.lang.IllegalArgumentException: > > > > > FieldDescriptor does not match message type. > > > > > at > > > > > > com.google.protobuf.DynamicMessage.verifyContainingType(DynamicMessage.java: > > > > > 242) > > > > > at > > > com.google.protobuf.DynamicMessage.getField(DynamicMessage.java: > > > > > 160) > > > > > at net.lookin.protobuf.Test.main(Test.java:64) > > > > > > > Why I recive exception? > > > > > How I can access to specific field value in DynamicMessage? > > > > > > > -- > > > > > 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. > > -- > 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.