89

Is it a good choice to use Google Protocol Buffers in JavaScript or is it better to do it with JSON?

Also it'd be great if someone can give me a simple example about Protocol Buffers implementation in JavaScript. The documentation on the Google's site is scarce.

Neurotransmitter
  • 6,289
  • 2
  • 51
  • 38
nikolakoco
  • 1,343
  • 1
  • 12
  • 22
  • 4
    This SO thread contains more information about the subject: http://stackoverflow.com/questions/7074147/protocol-buffers-for-javascript – alavrik Aug 16 '11 at 15:21

4 Answers4

80

[edit] Google's open source implementation of protocol buffers is available on GitHub


The official protobuf project support only Java, C++, and Python. Not JavaScript.

According to the Wiki of the project, there are three projects porting protocol buffers to JavaScript.

Protobuf.js is up to date. protobuf-js has not been updated for two years, so I would favor Protobuf.js.

The question still is "Why?": protobuf may be a bit smaller, especially when a lot of numeric values are transferred, but JSON is simply the more common protocol in the JS space and probably better supported and easier to integrate into other tools.

rocky
  • 7,506
  • 3
  • 33
  • 48
dmeister
  • 34,704
  • 19
  • 73
  • 95
  • Yes, I must agree with you. JSON is the better option in this case. Thanks – nikolakoco Aug 04 '11 at 09:38
  • Might come in handy when doing cross domain things, where JSONP is limited to about 2,000 characters due to [IE's limit of the GET request](http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url). Have not used it though. – Arjan Aug 23 '12 at 08:09
  • 11
    No doubt about JSON being more fit to most cases. However in my case the message sender is not under my control, and it serializes to protobuf messages, thus we need to parse the messages from javascript. – Jan Segre Mar 04 '13 at 11:49
  • 25
    @Why: Because you write a message and service methods as proto and you get skeleton of the code for free? Serialization and deserialization on both client/server side. – Paweł Szczur Mar 20 '13 at 12:22
  • 17
    Why: the same reason to use protobuf in any other situation. Don't forget that browsers now have WebSocket. Also, desktop applications can be written in JS for Windows 8, and applications, including servers, in Node. – Sprague Aug 19 '13 at 12:50
  • 4
    Code Climate has a great writeup on [the benefits of protobuf over JSON](http://blog.codeclimate.com/blog/2014/06/05/choose-protocol-buffers/) – Jordan Aug 30 '14 at 05:13
  • 6
    If your system's API already has other binary/protobuf clients, such as Android or iOS devices, then it's more natural to use the existing proto API for a Javascript web client than to build a second copy of the API that offers JSON, just to support a web page. – Zero Trick Pony Sep 05 '14 at 18:47
  • 1
    The Code Climate article says it's a good idea for services NOT directly consumed by browsers. – Tatiana Racheva Nov 04 '14 at 17:07
  • @Why?: Because you are trying to reduce network transfer cost and while JSON is a de-facto standard, if you care about latency or bandwidth costs involved in the communication you can save. @Why?: Because Google uses it and OBVIOUSLY anything they use MUST be awesome! (Satire anyone?) – Norman H Feb 17 '15 at 20:53
  • 1
    does any of the implementations follow import statements inside .proto files? – Novellizator Jul 14 '15 at 09:24
  • @dmeister I want `protobuf 2.5.0` to support __Javascript__. Is using __Protobuf.js__ right here ? – roottraveller Feb 03 '18 at 15:40
  • It seems this answer should be updated since (as the answer below says) there is full support for JavaScript now. – Miguel Garcia Aug 26 '21 at 16:53
  • This is outdated answer! – Ali Oct 16 '21 at 17:58
44

Update (28/7/2016): Release 3.0.0 was published - supporting Javascript and other languages as well - in addition to some other features.

Google have recently added alpha support for JS to protobufs: https://github.com/google/protobuf/releases/tag/v3.0.0-beta-2

Usage:

protoc -I=$SRC_DIR --js_out=$DST_DIR $SRC_DIR/addressbook.proto

Screenshots from the release documentation:

enter image description here

enter image description here

AlikElzin-kilaka
  • 34,335
  • 35
  • 194
  • 277
5

Protobuf 3.0.0 is out: https://github.com/google/protobuf/releases/tag/v3.0.0

And it support JavaScript natively. The basic information is in the announcement.

We are going to look into it soon.

Ondrej Burkert
  • 6,617
  • 2
  • 32
  • 27
-1

Try Protostuff!

I had a bit of hard time configuring but I'm sure that was more of my issue. You can serialize/deserialize a protobuff/protostuff message to/from JSON. I'm at the early stages of using this but it looks promising so far.

John Slegers
  • 45,213
  • 22
  • 199
  • 169
JeffSpicoli
  • 93
  • 1
  • 7
  • 1
    Curious. Why was this voted down (I have no opinion about Protostuff)? – Pimin Konstantin Kefaloukos Mar 04 '13 at 12:49
  • 9
    @Pimin probably because protostuff is Java and the question is JavaScript? – Marc Gravell Sep 06 '13 at 20:08
  • 1
    @PiminKonstantinKefaloukos person is searching protobuf implementation on *javascript* – holms Feb 16 '14 at 15:29
  • 2
    Building Javascript objects for GWT using Protostuff: http://code.google.com/p/protostuff/wiki/GwtJsonOverlays . Totally on topic. – Fuzzy Analysis Mar 14 '14 at 04:57
  • 4
    @fuzzyanalysis Fair although I would then call this answer incomplete rather than simply wrong. Since you can't expect every visitor to know how to compile Java to JS or to even know GWT exists, you'd expect at least a pointer to GWT or ideally a working example of getting it working in GWT - since that could be quite the adventure. – Chris Moschini Jul 22 '14 at 22:07
  • Hey, GWT is google, do THEY even use Protobuf with GWT? Seems like "they" should be providing this already! – Norman H Feb 17 '15 at 20:54