A new implementation of Protocol Buffers in Ruby.
If you’re not familiar with Protocol Buffers, start with Google’s homepage: code.google.com/apis/protocolbuffers
Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data -- think XML, but smaller, faster, and simpler.
Rubyforge is cuckoo for protopuffs.
sudo gem install protopuffs
Start with a proto
file, say, proto/animals.proto
:
message Bird { required string name = 1; optional string species = 2; }
First, require Protopuffs and tell it where your proto
files are:
require 'protopuffs' Protopuffs.proto_load_path << "proto" Protopuffs.load_message_classes
That makes the Bird message dynamically available in Ruby. Everything’s namespaced under Protopuffs::Message
, which should help with your OCD.
bird = Protopuffs::Message::Bird.new bird.name = "Sonny" bird.species = "Cuculus canorus" # encode this message to the super-efficient binary wire format binary_bird = bird.to_wire_format # or encode to the human-friendly text format, for debugging puts bird.inspect
You can also decode incoming binary wire-format messages:
decoded_bird = Protopuffs::Message::Bird.new decoded_bird.from_wire_format(binary_bird) decoded_bird.name # => "Sonny"
TODO: explain Message::Base.new
with strings containing the wire format or hashes, as well as #attributes=
Protopuffs currently only supports a base set of the .proto
file syntax. Here’s what’s missing:
-
the sfixed64 type
-
sint32 and sint64 types (due to lack of support for ZigZag encoding)
-
packed repeated fields (the
[packed=true]
option) -
enumerations
-
importing definitions
-
nested message types
-
extensions
-
nested extensions
-
packages
-
services
-
built-in options
-
custom options
-
groups (deprecated)