Protopuffs!
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.
Installation
Rubyforge is cuckoo for protopuffs.
sudo gem install protopuffs
Usage
Start with a proto
file, say, proto/animals.proto
:
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.
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"
Mass-assignment
TODO: explain Message::Base.new
with strings containing the wire format or hashes, as well as #attributes=
Missing functionality
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)