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 <[email protected]> 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 <[email protected]> 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 <[email protected]> wrote:
> > > On Wed, Jun 22, 2011 at 3:30 AM, slookin <[email protected]> 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("[email protected]");
> > > > 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: "[email protected]"
>
> > > > 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 [email protected].
> > > > To unsubscribe from this group, send email to
> > > > [email protected].
> > > > 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 [email protected].
> > To unsubscribe from this group, send email to
> > [email protected].
> > 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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.

Reply via email to