On the high level I have a wrapper for RpcChannel implements transport. Inside transport I need to parse response. To do that I need and instance of service. To create an instance of service (stub) I need to provide and instance of channel to it. So, my service depends on channel and channel depends on service. I have multiple channels (pool) I'm using to send/receive each packet. If I want to hide my implementation guts, I don't want user to create service and then call another method to link that service with channel (I don't have access to service from channel). This is in nutshell my egg-chicken dilemma. So I want to get rid of one of dependencies, and the one I thought about was replacing Service implementation with Descriptor...
On Feb 24, 12:40 pm, Kenton Varda <ken...@google.com> wrote: > The way this is intended to work is that you should have a pointer to the > Service object and call its getRequestPrototype() method. I don't > understand why you would need to decode requests without having a Service > object for which they are destined. > > > > On Tue, Feb 23, 2010 at 8:56 PM, ph <pkirsa...@gmail.com> wrote: > > Thanks > > > It looks like there is no elegant way to solve my issue. > > In short, I have a transport implementation to use with PB RPC > > service. > > Service definitions are built-in and I need to convert byte array to > > Message inside my transport. I know what service transport handles and > > I have method name. > > ServiceDescriptor has descriptors of all types I possibly need, but > > unfortunately I looks like there is no way to construct message from > > byte array having MessageDescriptor (which I can get from > > ServiceDescriptor). > > > On Feb 23, 7:28 pm, Kenton Varda <ken...@google.com> wrote: > > > (But to answer your question: Compiled-in types are almost always faster > > > than DynamicMessage.) > > > > On Tue, Feb 23, 2010 at 4:27 PM, Kenton Varda <ken...@google.com> wrote: > > > > I'm not sure how your approach works, but since it looks like you're > > using > > > > Java reflection, my guess is that it will only work with compiled-in > > > > services. If your code is a library, this will prevent users of that > > > > library from using dynamic types, which is unfortunate. If the users > > > > provide a default instance, then they can choose to provide either a > > > > compiled-in type or a dynamic type. > > > > > On Tue, Feb 23, 2010 at 1:55 PM, ph <pkirsa...@gmail.com> wrote: > > > > >> Thanks Kenton, > > > > >> I was using getRequestPrototype, but I need an actual instance of > > > >> Service to call that method that created additional extra dependency > > > >> in my code that why I started to look for alternatives. I know my > > > >> method name and currently I'm just parsing response (byte array) this > > > >> way (in Scala): > > > >> Class.forName ( String.format ( classNameFormat, methodName ) ) > > > >> .getDeclaredMethod ( "parseFrom", Array ( msg.getClass ) : _* ) > > > >> .invoke ( null, Array ( msg ) : _* ).asInstanceOf > > > >> [ com.google.protobuf.GeneratedMessage ] > > > >> This works fine. I will try to use a Default Message or > > > >> DynamicMessage, thanks for suggestion. From the top of your head, do > > > >> you think DynamicMessage will be faster or slower than my approach? > > > > >> On Feb 22, 6:10 pm, Kenton Varda <ken...@google.com> wrote: > > > >> > Right, Descriptor.toProto() returns a DescriptorProto, which is > > itself a > > > >> > protobuf type. So, calling newBuilderForType() on that is going to > > > >> return a > > > >> > builder for DescriptorProto, not a builder for the type described. > > > > >> > What you want is com.google.protobuf.DynamicMessage. > > > > >> > Note that DynamicMessage is slower than the message classes produced > > by > > > >> > protoc. So if the type in question is actually compiled in to your > > app, > > > >> you > > > >> > should use it instead. Typically what you'd do is pass around the > > > >> type's > > > >> > default instance (MyMessageType.getDefaultInstance()) instead of > > passing > > > >> > around the descriptor. > > > > >> > Note that the Service interface also provides a method > > > >> > getRequestPrototype(MethodDescriptor) which returns the default > > instance > > > >> for > > > >> > the type, on which you can then call newBuilderForType(). > > > > >> > On Sat, Feb 20, 2010 at 12:54 PM, ph <pkirsa...@gmail.com> wrote: > > > >> > > I'm trying to build service return message using > > > >> > > Descriptors.ServiceDescriptor. > > > >> > > This does not work: > > > >> > > serviceDescriptor.findMethodByName > > > >> > > ( methodName ).getOutputType.toProto.newBuilderForType.mergeFrom > > > >> > > ( msg ).build > > > >> > > "msg" is byte array > > > >> > > It builds DesscriptorProtos.DescriptorProto instead of Message. > > > > >> > > Is there a way to build message from byte array using method > > > >> > > descriptor? > > > > >> > > -- > > > >> > > You received this message because you are subscribed to the Google > > > >> Groups > > > >> > > "Protocol Buffers" group.>> > > To post to this group, send email > > toproto...@googlegroups.com. > > > >> > > To unsubscribe from this group, send email to>> > > > > protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.c > > om> > > <protobuf%2bunsubscr...@googlegroups.com<protobuf%252bunsubscr...@googlegro > > ups.com> > > > > >> <protobuf%2bunsubscr...@googlegroups.c om> > > > >> > > . > > > >> > > 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 > > toproto...@googlegroups.com. > > > >> To unsubscribe from this group, send email to>> > > protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.c > > om> > > <protobuf%2bunsubscr...@googlegroups.com<protobuf%252bunsubscr...@googlegro > > ups.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 proto...@googlegroups.com. > > To unsubscribe from this group, send email to > > protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.c > > om> > > . > > 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 proto...@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.