Protocol Buffers

Uses your system voice; voice and rate in settings.

Snapshot

≈ 5 min read

Names in other languages

No names in other languages are held for this entry yet.

Article bodies are English and are not machine-translated. A name in another language is not a translation of the article.

Protocol Buffers (Protobuf) is a free and open-source cross-platform data format used to serialize structured data. It is useful in developing programs that communicate with each other over a network or for storing data. The method involves an interface description language that describes the structure of some data and a program that generates source code from that description for generating or parsing a stream of bytes that represents the structured data.

Protocol Buffers (Protobuf) is a free and open-source cross-platform data format used to serialize structured data. It is useful in developing programs that communicate with each other over a network or for storing data. The method involves an interface description language that describes the structure of some data and a program that generates source code from that description for generating or parsing a stream of bytes that represents the structured data. ==Overview== Google developed Protocol Buffers for internal use and provided a code generator for multiple languages under an open-source license. The design goals for Protocol Buffers emphasized simplicity and performance. In particular, it was designed to be smaller and faster than XML. Protocol Buffers is widely used at Google for storing and interchanging all kinds of structured information. The method serves as a basis for a custom remote procedure call (RPC) system that is used for nearly all inter-machine communication at Google. Protocol Buffers is similar to the Apache Thrift, Amazon Ion, and Microsoft Bond protocols, offering a concrete RPC protocol stack to use for defined services called gRPC. Data structure schemas (called messages) and services are described in a proto definition file ( .proto ) and compiled with protoc . This compilation generates code that can be invoked by a sender or recipient of these data structures. For example, example.pb.cc and example.pb.h are generated from example.proto . They define C++ classes for each message and service in example.proto . Canonically, messages are serialized into a binary wire format which is compact, forward- and backward-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 Buffers file. The officially supported implementation includes an ASCII serialization format, but this format—though self-describing—loses the forward- and backward-compatibility behavior, and is thus not a good choice for applications other than human editing and debugging. Though the primary purpose of Protocol Buffers is to facilitate network communication, its 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. ==Example== 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/storage savings compared with systems that include the field names in the data.) // polyline.proto syntax = "proto2"; 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, and thus Polyline behaves like a set of points (of unspecified number). 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. For example, after a C++ version of the protocol buffer schema above is produced, a C++ source code file, , can use the message objects as follows: // polyline.cpp include "polyline.pb.h" // generated by calling "protoc polyline.proto" import std; using std::string; using std::shared_ptr shared_ptr createNewLine(const string& name) { // create a line from (10, 20) to (30, 40) shared_ptr line = std::make_shared (); line->mutable_start()->set_x(10); line->mutable_start()->set_y(20); line->mutable_end()->set_x(30); line->mutable_end()->set_y(40); line->set_label(name); return line; } shared_ptr createNewPolyline() { // create a polyline with points at (10,10) and (20,20) shared_ptr polyline = std::make_shared (); shared_ptr point1 = std::make_shared (polyline->add_point()); point1->set_x(10); point1->set_y(10); shared_ptr point2 = std::make_shared (polyline->add_point()); point2->set_x(20); point2->set_y(20); return polyline; } ==Language support== Protobuf 2.0 provides a code generator for C++, Java, C#, and Python. Protobuf 3.0 provides a code generator for C++, Java (including JavaNano, a dialect intended for low-resource environments), Kotlin, Python, Go, Ruby, Objective-C, C#, PHP, Dart. It also supports JavaScript since 3.0.0-beta-2. Third-party implementations are also available for Ada, Ballerina, C, C++, Dart, Elixir, Erlang, Haskell, JavaScript, Julia, Nim, Perl, PHP, Prolog, R, Rust, Scala, and Swift. ==See also== gRPC Comparison of binary data serialization formats FlatBuffers ASN.1 ==References== ==External links== Official documentation at developers.google.com

Text derived from https://en.wikipedia.org/w/index.php?oldid=1357670495 under CC BY-SA 4.0; modifications have been made.