An implementation of Protocol Buffers for Ruby.
Ruby C Shell
Pull request Compare This branch is 132 commits ahead, 1 commit behind mozy:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Ruby Protocol Buffers

Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats.

This library has two components: a compiler to turn .proto definitions into Ruby modules (extension .pb.rb), and a runtime to use protocol buffers defined by these modules. The compiler relies on Google's C++ based compiler (+protoc+) for much of the heavy lifting -- this has huge advantages in ensuring compatibility and correctness.

This library is heavily optimized for encoding and decoding speed. There is a small C extension available in the ext/ dir that will improve performance even further. The encoding performance is currently limited by the ruby IO performance, which could be further improved in C.

Because this is a tool for generating code, the RDoc documentation is a bit unusual. See the text in the ProtocolBuffers::Message class for details on what code is generated.


You'll need protoc version >= 2.2 (the Google Protocol Buffer compiler) installed in the environment where you will be compiling protocol buffers. This is only needed for compiling, you don't need it installed to use the generated .pb.rb files. You do need this Ruby library installed to use the .pb.rb files, for the runtime support.

If you use RubyGems, you can install via:

$ sudo gem install ruby-protocol-buffers


Supported Features

  • messages, enums, field types, all basic protobuf features
  • packages
  • imports
  • nested types
  • passing on unknown fields when re-serializing a message

Unsupported Features

  • extensions
  • packed option (could be useful)
  • accessing custom options

Probably Never to be Supported

  • RPC stubbing
  • deprecated protocol features (e.g. groups)
  • the unsupported options (java_*, optimize_for, message_set_wire_format, deprecated)

Simple Usage Example

$ echo "package Test; message MyMessage { optional string myField = 1; }" > test.proto
$ bin/ruby-protoc test.proto
$ irb -I./lib -rtest.pb
> msg = => 'zomgkittenz')
=> #<Test::MyMessage myField="zomgkittenz">
> Test::MyMessage.parse(msg.to_s) == msg
=> true


Brian Palmer (



See the LICENSE file included with the distribution for licensing and copyright details.