[erlang-questions] BERT vs protobuf in the erlang world

Vincent de Phily <>
Wed Aug 24 11:34:47 CEST 2011


On Tuesday 23 August 2011 16:22:46 Anthony Molinaro wrote:
> To me a self-describing protocol is something which also encoded the names
> of the messages and fields, so you could send it through to the other side
> and it would be unambiguous.  An example of this is a system I wrote many
> years ago called lwes (www.lwes.org), which does not require code generation
> because messages are self describing.

Yes, that's what I meant by self-describing. You can dump an unknown message 
and know not only that it's {42, "car"} but also that it's {id:42, 
class:"car"}.

Protobuf takes carefull steps to enable grammar extensibility, but it is still 
not as flexible as a self-described format. You cannot switch a field to be 
optional, add a required field, reorder fields, or start sending a list of 
objects when you used to send a single one for example.

One thing that irks me about protobuf is that it doesn't have proper 
"optional" fields: you'll always end up with a default value instead of "not 
present" and decoders won't tell you if they inferred the default value 
themselves. You can kludge around by using a sentinel value or a field 
repeated zero times but this is not the same thing.

If you're going the grammar-described-format route, I'd go with asn1 instead 
of protobuf unless :
* support for $OTHER_LANGUAGE is needed (despite being nearly as old as me,
  asn1 support isn't ubiquitous yet, and sometimes costs a fortune).
* codec speed is paramount (I haven't benched one against the other for CPU
  usage, but I expect protobuf to have the edge)
With asn1, you get a better grammar that supports :
* DEFAULT vs OPTIONAL
* CHOICE (like a protobuf enum, except values can be anything, not just
  integer)
* checked ranges for everything, from integers to list size to character set
  (why waste a full byte when you're only using characters [a-z_] ?)
* Neat tricks like 'NULL' and single-value ranges
Extensibility of the BER variant is just as good/quirky as protobuf's, and if 
your bytes cost money you can spend less with the UPER variant.
-- 
Vincent de Phily




More information about the erlang-questions mailing list