World Library  
Flag as Inappropriate
Email this Article

Protocol Buffers

Article Id: WHEBN0018338104
Reproduction Date:

Title: Protocol Buffers  
Author: World Heritage Encyclopedia
Language: English
Subject: SCaViS, Apache Avro, Comparison of data serialization formats, Sawzall (programming language), Google Test
Publisher: World Heritage Encyclopedia

Protocol Buffers

Protocol Buffers
Developer(s) Google
Initial release July 7, 2008 (2008-07-07)
Stable release 2.6.1 / October 20, 2014 (2014-10-20)
Development status Active
Operating system Any
Platform Cross-platform
Type serialization format and library, IDL compiler
License BSD
Website //

Protocol Buffers are a method of serializing structured data. As such, they are useful in developing programs to communicate with each other over a wire or for storing data. The method involves an interface description language that describes the structure of some data and a program that generates from that description source code in various programming languages for generating or parsing a stream of bytes that represents the structured data.

Google developed Protocol Buffers for use internally and has made protocol compilers for C++, Java and Python available to the public under a free software, open source license. Various other language implementations are also available.[1]

The design goals for Protocol Buffers emphasized simplicity and performance. In particular, it was designed to be smaller and faster than XML.[2] Third parties have reported that protocol buffers outperform the standardized Abstract Syntax Notation One with respect to both message size and decoding performance.[3]

Protocol Buffers are widely used at Google for storing and interchanging all kinds of structured information. Protocol Buffers serve as a basis for a custom remote procedure call (RPC) system that is used for nearly all inter-machine communication at Google.[1]

Protocol Buffers are very similar to the Apache Thrift protocol (used by Facebook for example), except that the public Protocol Buffers implementation does not include a concrete RPC protocol stack to use for defined services.

A software developer defines data structures (called messages) and services in a proto definition file (.proto) and compiles it with protoc. This compilation generates code that can be invoked by a sender or recipient of these data structures. For example, example.proto will produce and example.pb.h, which will define C++ classes for each message and service that example.proto defines.

Canonically, Protocol Buffers are serialized into a binary wire format which is compact, forwards-compatible, and backwards-compatible, but not self-describing (that is, there is no way to tell the names, meaning, or full datatypes of fields without an external specification). There is no defined way to include or refer to such an external specification (schema) within a Protocol Buffer file. The officially supported implementation includes an ASCII serialization format,[4] but this format — though self-describing — loses the forwards-and-backwards-compatibility behavior, and is thus not a good choice for applications other than debugging.

Though the primary purpose of Protocol Buffers is to facilitate network communication, their simplicity and speed make Protocol Buffers an alternative to data-centric C++ classes and structs, especially where interoperability with other languages or systems might be needed in the future.


A schema for a particular use of protocol buffers associates data types with field names, using integers to identify each field. (The protocol buffer data contains only the numbers, not the field names, providing some bandwidth or storage saving compared with alternative systems that do include the field names in the data.):


message Point {
  required int32 x = 1;
  required int32 y = 2;
  optional string label = 3;

message Line {
  required Point start = 1;
  required Point end = 2;
  optional string label = 3;

message Polyline {
  repeated Point point = 1;
  optional string label = 2;

The "Point" message defines two mandatory data items, x and y. The data item label is optional. Each data item has a tag. The tag is defined after the equal sign. For example, x has the tag 1.

The "Line" and "Polyline" messages, which both use Point, demonstrate how composition works in Protocol Buffers. Polyline has a repeated field, which behaves like a vector.

This schema can subsequently be compiled for use by one or more programming languages. Google provides a compiler called protoc which can produce output for C++, Java or Python. Other schema compilers are available from other sources to create language-dependent output for over 20 other languages.[5]

For example, after a C++ version of the protocol buffer schema above is produced, a C++ source code file, polyline.cpp, can use the message objects as follows:

// polyline.cpp
#include "polyline.pb.h"  // generated by calling "protoc polyline.proto"

Line* createNewLine(const std::string& name) {
  // create a line from (10, 20) to (30, 40)
  Line* line = new Line;
  return line;

Polyline* createNewPolyline() {
  // create a polyline with points at (10,10) and (20,20)
  Polyline* polyline = new Polyline;
  Point* point1 = polyline->add_point();
  Point* point2 = polyline->add_point();
  return polyline;

See also


  1. ^ "ThirdPartyAddOns - protobuf - Links to third-party add-ons. - Protocol Buffers - Google's data interchange format - Google Project Hosting". Retrieved 2012-11-07. 
  2. ^ Eishay Smith. "jvm-serializers Benchmarks". Retrieved 2010-07-12. 
  3. ^ "Why to reinvent the wheel?". Retrieved 2014-02-08. 
  4. ^ "text_format.h - Protocol Buffers - Google Code". Retrieved 2012-03-02. 
  5. ^ ThirdPartyAddOns - protobuf - Links to third-party add-ons. - Protocol Buffers - Google's data interchange format - Google Project Hosting. Retrieved on 2013-09-18.

External links

  • Official project page at
  • Another official home page at Google Open Source project hosting
  • Protocol Buffers Objective-C
  • Protocol Buffers Apple Swift
This article was sourced from Creative Commons Attribution-ShareAlike License; additional terms may apply. World Heritage Encyclopedia content is assembled from numerous content providers, Open Access Publishing, and in compliance with The Fair Access to Science and Technology Research Act (FASTR), Wikimedia Foundation, Inc., Public Library of Science, The Encyclopedia of Life, Open Book Publishers (OBP), PubMed, U.S. National Library of Medicine, National Center for Biotechnology Information, U.S. National Library of Medicine, National Institutes of Health (NIH), U.S. Department of Health & Human Services, and, which sources content from all federal, state, local, tribal, and territorial government publication portals (.gov, .mil, .edu). Funding for and content contributors is made possible from the U.S. Congress, E-Government Act of 2002.
Crowd sourced content that is contributed to World Heritage Encyclopedia is peer reviewed and edited by our editorial staff to ensure quality scholarly research articles.
By using this site, you agree to the Terms of Use and Privacy Policy. World Heritage Encyclopedia™ is a registered trademark of the World Public Library Association, a non-profit organization.

Copyright © World Library Foundation. All rights reserved. eBooks from Project Gutenberg are sponsored by the World Library Foundation,
a 501c(4) Member's Support Non-Profit Organization, and is NOT affiliated with any governmental agency or department.