Ok… awesome… I do have the .proto’s ahead of time, so I can have them 
compiled to the .desc files and store those.

Here’s my .proto file:

package com.lithum.pbnj;

import "google/protobuf/descriptor.proto";

option java_package = "com.lithium.pbnj";

extend google.protobuf.FieldOptions {
    optional bool isPii = 50101;
}

message MessagePublish {
    required string uuid = 1;
    required int64 timestamp = 2;
    required int64 message_uid = 3;
    required string message_content = 4;
    required int64 message_author_uid = 5;
    optional string email = 6 [(isPii) = true];
}

I compiled this .proto file into a .desc file using the command you gave 
me. I’m now trying to parse a DynamicMessage from the .desc file. Here’s 
the code I have so far.

        DescriptorProtos.FileDescriptorSet descriptorSet = 
DescriptorProtos.FileDescriptorSet.parseFrom(PBnJ.class.getResourceAsStream("/messages.desc"));
        Descriptors.Descriptor desc = 
descriptorSet.getFile(0).getDescriptorForType();

        Messages.MessagePublish event = Messages.MessagePublish.newBuilder()
                .setUuid(UUID.randomUUID().toString())
                .setTimestamp(System.currentTimeMillis())
                .setEmail("he...@example.com")
                .setMessageAuthorUid(1)
                .setMessageContent("hello world!")
                .setMessageUid(1)
                .build();

        DynamicMessage dynamicMessage = DynamicMessage.parseFrom(desc, 
event.toByteArray());

The final line in the above code is throwing the following exception:

Exception in thread "main" com.google.protobuf.InvalidProtocolBufferException: 
Protocol message end-group tag did not match expected tag.
    at 
com.google.protobuf.InvalidProtocolBufferException.invalidEndTag(InvalidProtocolBufferException.java:94)
    at 
com.google.protobuf.CodedInputStream.checkLastTagWas(CodedInputStream.java:174)
    at 
com.google.protobuf.CodedInputStream.readMessage(CodedInputStream.java:478)
    at 
com.google.protobuf.MessageReflection$BuilderAdapter.parseMessage(MessageReflection.java:482)
    at 
com.google.protobuf.MessageReflection.mergeFieldFrom(MessageReflection.java:780)
    at 
com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:336)
    at 
com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:318)
    at 
com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:229)
    at 
com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:180)
    at 
com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:419)
    at 
com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:229)
    at 
com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:171)
    at 
com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:412)
    at com.google.protobuf.DynamicMessage.parseFrom(DynamicMessage.java:119)
    at com.lithium.pbnj.PBnJ.main(PBnJ.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

On Friday, October 31, 2014 11:39:27 AM UTC-7, Oliver wrote:

Basically, you can't do that in pure Java - the compiler is a C++ 
> binary, there is no Java version. 
>
> Still, working with the output of --descriptor_set_out is probably the 
> way to go here. If you have the .proto file ahead of time, you can 
> pregenerate the descriptor output at build time and store it instead 
> of the .proto file. If you don't have the .proto file ahead of time 
> (and you can't redesign - this is not a good design) then you could 
> run the compiler at runtime and read the output. Either way, now you 
> have a parsed version of the message format as a protobuf-encoded 
> message that you can read into your Java program and extract the 
> Descriptors you need. 
>
> If you're looking at a selfdescribing message format, then I'd go with 
> using the parsed descriptors as your format description, not the text 
> .proto file. 
>
> Oliver 
>
>
> On 31 October 2014 17:56, Pradeep Gollakota <prade...@gmail.com 
> <javascript:>> wrote: 
> > Hi Oliver, 
> > 
> > Thanks for the response! I guess my question wasn't quite clear. In my 
> java 
> > code I have a string which contains the content of a .proto file. Given 
> this 
> > string, how can I create an instance of a Descriptor class so I can do 
> > DynamicMessage parsing. 
> > 
> > Thanks! 
> > - Pradeep 
> > 
> > On Thursday, October 30, 2014 2:41:19 PM UTC-7, Oliver wrote: 
> >> 
> >> On 30 October 2014 02:53, Pradeep Gollakota <prade...@gmail.com> 
> wrote: 
> >> 
> >> > I have a use case where I need to parse messages without having the 
> >> > corresponding precompiled classes in Java. So the DynamicMessage 
> seems 
> >> > to be 
> >> > the correct fit, but I'm not sure how I can generate the 
> DescriptorSet 
> >> > from 
> >> > the ".proto" definition. 
> >> 
> >> protoc --descriptor_set_out=FILE ? 
> >> 
> >> Oliver 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> Groups 
> > "Protocol Buffers" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an 
> > email to protobuf+u...@googlegroups.com <javascript:>. 
> > To post to this group, send email to prot...@googlegroups.com 
> <javascript:>. 
> > Visit this group at http://groups.google.com/group/protobuf. 
> > For more options, visit https://groups.google.com/d/optout. 
>
​

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to protobuf+unsubscr...@googlegroups.com.
To post to this group, send email to protobuf@googlegroups.com.
Visit this group at http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to