Kenton,

This description in the MessageLite documentation is what led me to
believe the default values would be there.  I figured I was
misinterpreting the documentation, or the meaning behind the default
value:

getDefaultInstanceForType

MessageLite getDefaultInstanceForType()
Get an instance of the type with all fields set to their default
values. This may or may not be a singleton. This differs from the
getDefaultInstance() method of generated message classes in that this
method is an abstract method of the MessageLite interface whereas
getDefaultInstance() is a static method of a specific class. They
return the same thing.

http://code.google.com/apis/protocolbuffers/docs/reference/java/index.html

Thanks for your help,
Kevin


On Mar 22, 7:07 pm, Kenton Varda <[email protected]> wrote:
> "required" means "If this field is not explicitly set before build() is
> called, or if parseFrom() parses a message missing this field, throw an
> exception.".  It does NOT mean "Automatically fill in this field.".  Please
> point me at any documentation which suggests the latter meaning so I can fix
> it.
>
> The default value is the value returned by the field's getter when the field
> has not been explicitly assigned any other value.
>
> getAllFields() only returns field which have been explicitly set.
>
> On Mon, Mar 22, 2010 at 2:42 PM, Kevin Tambascio
> <[email protected]>wrote:
>
>
>
> > 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 <[email protected]> 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
> > > <[email protected]>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 [email protected].
> > > > To unsubscribe from this group, send email to
> > > > [email protected]<protobuf%[email protected]
> > > >  om>
> > <protobuf%[email protected] 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 [email protected].
> > To unsubscribe from this group, send email to
> > [email protected]<protobuf%[email protected] 
> > 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 [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