Kenton,

I did make some more progress today, along the lines of what you said
below.  I'm seeing an issue where calling
DynamicMessage.getDefaultInstance(type) is not filling in the default
values.  This is with 2.3.0 of GPB.

My proto file:

message StringTableEntry
{
  required string lang  = 1 [default = "en-US"];
  required string value = 2 [default = ""];
}

When I instantiate an instance of StringTableEntry, using
DynamicMessage, the required fields are not in the message instance.
>From reading the documentation, it sounds like the default values
should show up if I create an object.  My code for creation is this:

                FileDescriptor fd =
FileDescriptor.buildFrom(fdSet.getFile(0), fds);
                List<Descriptor> messageTypes = fd.getMessageTypes();
                for(Descriptor type : messageTypes)
                {
                        DynamicMessage dm =
DynamicMessage.newBuilder(type).getDefaultInstanceForType();

                       //DynamicMessage dm =
DynamicMessage.getDefaultInstance(type);

                        Map<FieldDescriptor, Object> dmFields =
dm.getAllFields();
                        for(Entry<FieldDescriptor, Object> entry : 
dmFields.entrySet())
                        {
                                System.out.println("default value for this 
field: " +
entry.getValue().toString());
                                entry.setValue("Data");
                        }

                        System.out.println(XmlFormat.printToString(dm));
                }

When instantiating the object, using either the commented or
uncommented out lines of code above, fails to contain the required
fields with their default values.  If I poke around the 'type'
variable in the debugger, I can see that the 2 fields are in the
descriptor, and the default values are there as well.  But the
instance of the message does not contain those two fields
(dmFields.entrySet() returns null, and the code inside the
"for(Entry<FieldDescriptor, Object> entry : dmFields.entrySet())" loop
does not execute).

It seems like I could write a routine to set the default values based
on the Descriptor data, but I think that getDefaultInstance should do
that for me.

Thoughts?

Thanks,
Kevin


On Mar 22, 4:02 pm, Kenton Varda <ken...@google.com> wrote:
> DescriptorProto.getDescriptorForType() returns the Descriptor for
> DescriptorProto, not for the type which that DescriptorProto is describing.
>  Remember that DescriptorProto is just a protocol message like any other --
> it does not have any special methods that recognize its higher-level
> meaning.
>
> To convert DescriptorProtos to Descriptors, you need to use
> FileDescriptor.buildFrom().
>
> On Sun, Mar 21, 2010 at 5:20 PM, Kevin Tambascio
> <kevin.tambas...@gmail.com>wrote:
>
>
>
> > Hi,
>
> > I'm having trouble getting the following code to work.  Using
> > protoc.exe, I generated a file with the descriptor data using the --
> > descriptor_set_out file.  I've written some Java code to read the
> > file, and try to instantiate a default instance of one of the objects
> > in the descriptor, so that I write it out to an XML file using the
> > protobuf-format-java library.
>
> > Here's my code.  The variable "descriptorData" contains the binary
> > content of the descriptor file, without any modifications:
>
> >                DescriptorProtos.FileDescriptorSet fdSet =
> > FileDescriptorSet.newBuilder().mergeFrom(descriptorData).build();
> >                FileDescriptorProto fdp = fdSet.getFile(0);
>
> >                List<DescriptorProto> messageTypes =
> > fdp.getMessageTypeList();
> >                for(DescriptorProto type : messageTypes)
> >                {
> >                        System.out.println("Type is: " + type.getName());
> >                        FileDescriptor fd =
> > type.getDescriptorForType().getFile();
>
> >                        DynamicMessage dm =
> > DynamicMessage.getDefaultInstance(type.getDescriptorForType());
> >                        System.out.println(XmlFormat.printToString(dm));
> >                }
>
> > I've tried numerous combinations of the above code, but each time I
> > get the following output:
>
> > Type is: Type1
> > <DescriptorProto></DescriptorProto>
> > Type is: Type2
> > <DescriptorProto></DescriptorProto>
> > Type is: Type3
> > <DescriptorProto></DescriptorProto>
> > Type is: Type4
> > <DescriptorProto></DescriptorProto>
> > Type is: Type5
> > <DescriptorProto></DescriptorProto>
> > Type is: Type6
> > <DescriptorProto></DescriptorProto>
>
> > The proto file has Type1, Type2, Type3, etc, defined as messages.  The
> > fact that type.getName() does return the type names from my proto
> > file, leads me to believe I'm heading in the right direction.
> > However, the DynamicMessage type that is created (and serialized to
> > XML) seems to indicate that I'm not passing the right descriptor
> > instance in to create the object.
>
> > Any thoughts?
>
> > Thanks,
> > Kevin
>
> > --
> > 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.

Reply via email to