On Wed, Oct 6, 2010 at 11:40 AM, Evan Jones <ev...@mit.edu> wrote:

> On Oct 6, 2010, at 9:23 , Igor Gatis wrote:
>
>> It would be nice to have mapped fields, e.g. key-value pairs.
>>
>
> I think that map support would probably be useful. I've basically created
> my own maps in protocol buffers a couple times, either by using two repeated
> fields, or a repeated field of a custom "pair" type. In these cases, it
> would have been nice to be able to use the Protocol Buffer as a map
> directly, rather than needing to transfer the data to some other object that
> actually implements the map. I would be interested to hear the opinion of
> the Google maintainers. I'm assuming that there are probably many
> applications inside Google that exchange map-like messages.
>
> This would be a big change, although it wouldn't be an impossible one, I
> don't think. I think it could be implemented as "syntactic sugar" over a
> repeated Pair message.


The syntactic sugar is what I meant by implementing it with repeated pairs.


> I think the biggest challenge is that maps are a "higher level" abstraction
> than repeated fields, which leads to many design challenges:
>
> * Are the maps ordered or unordered?
>        * If ordered, how are keys compared? This needs to be consistent
> across programming languages.
>        * If unordered, how are hash values computed? This could result in a
> message being parsed and re-serialized differently, if different languages
> compute the hashes differently.
>

Actually, I have a different opinion. High level is not a problem. It's a
dictionary, e.g. string -> object. It does not matter whether the list is
ordered or not. It does not matter how the hash is computed. Serialization
is simple: list of Pairs. The it does not matter the order.

A given implementation may decide to read each pair at a time and insert it
into a hashmap. The down side is that a big list will cause hashmap to grow
many times. A solution could be reading the flat list to figure out what the
size is, then create a map out of it.

       * For both, how are "'unknown" fields handled?
> * Do the maps support repeated keys?
>        * If not, what happens when parsing a message with repeated keys?
>

Hm... I'd say no. Simple (unique) string to object seems to fit lots of
people needs. Perhaps, thought, values could be repeated. But that is easily
achieved by a wrapping message which has a repeated object.


>
> Other message protocols contain map-like structures: JSON, Thrift, and
> Avro. Avro only supports string keys. JSON only supports primitive keys.
>  Thrift has a similar note about maps:
>
> http://wiki.apache.org/thrift/ThriftTypes
>
>  For maximal compatibility, the key type for map should be a basic type
>> rather than a struct or container type. There are some languages which do
>> not support more complex key types in their native map types. In addition
>> the JSON protocol only supports key types that are base types.
>>
>
>
> Evan
>
> --
> Evan Jones
> http://evanjones.ca/
>
>

-- 
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