Use Protocol Buffers with Ruby — gem installation, code generation, encoding, and decoding.
The Ruby Protocol Buffers runtime (version 4.35-dev) provides a native C extension for MRI Ruby and a Java extension for JRuby. Both expose the same API.
This example reads an address book from disk, prompts for a new person, and writes it back:
#!/usr/bin/env rubyrequire './addressbook_pb'require 'pry'def prompt_for_address() person = Tutorial::Person.new puts "Enter person ID number:" person.id = STDIN.gets.chomp.to_i puts "Enter name:" person.name = STDIN.gets.chomp puts "Enter email address (blank for none):" email = STDIN.gets.chomp if email != "" person.email = email end loop do puts "Enter a phone number (or leave blank to finish):" number = STDIN.gets.chomp if number == "" break end phone_number = Tutorial::Person::PhoneNumber.new(number: number) puts "Is this a mobile, home or work phone?" type = STDIN.gets.chomp case type when "mobile" phone_number.type = :MOBILE when "home" phone_number.type = :HOME when "work" phone_number.type = :WORK else puts "Unknown phone type; leaving as default value." end person.phones.push(phone_number) end personendif ARGV.length != 1 puts "Usage: #{$0} ADDRESS_BOOK_FILE" exit(-1)endaddress_book = Tutorial::AddressBook.new()if File.exist?(ARGV[0]) f = File.open(ARGV[0], "rb") address_book = Tutorial::AddressBook.decode(f.read) f.closeelse puts "#{$PROGRAM_NAME}: File not found. Creating new file."endperson = prompt_for_addressaddress_book.people.push(person)f = File.open(ARGV[0], "wb")f.write(Tutorial::AddressBook.encode(address_book))f.close
The FFI backend requires the ffi and ffi-compiler gems:
gem install ffi ffi-compiler
If ffi or ffi-compiler are not installed, or if the environment variable is not set to FFI, the traditional platform-native extension is used automatically.
MessageClass.encode(msg) returns a binary String. MessageClass.decode(bytes) returns a new message instance. These are class-level methods on every generated message class.
JSON
MessageClass.encode_json(msg) and MessageClass.decode_json(json_string) for canonical protobuf JSON.
Repeated fields
Repeated fields behave like Ruby arrays. Use standard array methods: push, each, map, length, etc.
Enums
Enum values are Ruby symbols (e.g., :MOBILE, :HOME). Assign and compare using symbols.