I have exteded data in my .proto file:

option java_outer_classname = "Foobar";
message Foo {
    optional int32 i = 1;
    extensions 10 to 99999;
}
message Bar {
    extend Foo {
        optional int32 j = 10001;
        optional string name = 10002;
    }
}
message Msg {
    optional Foo foo = 1;
}

So, here is code which i'm using to parse data using DynamicMessage:
// Create data
        Foobar.Foo foo = Foobar.Foo.newBuilder()
                .setI(123)
                .setExtension(Foobar.Bar.j, 456)
                .setExtension(Foobar.Bar.name, "simpleName")
                .build();
        Foobar.Msg msg = Foobar.Msg.newBuilder().setFoo(foo).build();
        byte[] msgData = msg.toByteArray();

        // register extensions
        ExtensionRegistry registry = ExtensionRegistry.newInstance();
        Foobar.registerAllExtensions(registry);

        final DescriptorProtos.FileDescriptorSet fds =
                DescriptorProtos.FileDescriptorSet.parseFrom(new 
FileInputStream("foobar.desc"));

        Descriptors.Descriptor descriptor =
                Descriptors.FileDescriptor.buildFrom(fds.getFile(0), new 
Descriptors.FileDescriptor[]{})
                        .findMessageTypeByName("Msg");

        // build Msg from data using dynamically created descriptor
        DynamicMessage dynamicMessage = 
DynamicMessage.parseFrom(descriptor, msgData, registry);
        System.out.println("dynamically created descriptor: " + 
JsonFormat.printToString(dynamicMessage));
        // build Msg from data using manually created descriptor
        DynamicMessage dynamicMessage1 = 
DynamicMessage.parseFrom(Foobar.Msg.getDescriptor(), msgData, registry);
        System.out.println("manually created descriptor: " + 
JsonFormat.printToString(dynamicMessage1));

Result:
dynamically created descriptor: {"foo": {"i": 123, "10001": [456], "10002": 
["simpleName"]}}
manually created descriptor: {"foo": {"i": 123,"Bar.j": 456,"Bar.name": 
"simpleName"}}

So, dynamicMessage1 parsed correctly - it has fields "Bar.j" and "Bar.name" 
which were parsed as extensions.
But dynamicMessage parsed incorrectly - those fields parsed as unknown 
fields and their names are equal to thier numbers - "10001" and "10002".

May be problem is in getting descriptor for the "Msg" message? Is it 
correct way to get the descriptor dynamicaly?

-- 
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/groups/opt_out.

Reply via email to