Share to: share facebook share twitter share wa share telegram print page

Protocol Buffers

Protocol Buffers
Developer(s)Google
Initial releaseEarly 2001 (internal)[1]
July 7, 2008 (2008-07-07) (public)
Stable release
28.2 Edit this on Wikidata / 18 September 2024; 8 days ago (18 September 2024)[2]
Repository
Written inC++, C#, Java, Python, JavaScript, Ruby, Go, PHP, Dart
Operating systemAny
PlatformCross-platform
Typeserialization format and library, IDL compiler
LicenseBSD
Websiteprotobuf.dev Edit this at Wikidata

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.[3]

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.[4]

Protocol Buffers is similar to the Apache Thrift, Ion, and Microsoft Bond protocols, offering a concrete RPC protocol stack to use for defined services called gRPC.[5]

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,[6] 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.[7]

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.

Limitations

Protobufs have no single specification.[8] The format is best suited for small data chunks that don't exceed a few megabytes and can be loaded/sent into a memory right away and therefore is not a streamable format.[9] The library doesn't provide compression out of the box. The format also isn't well supported in non–object-oriented languages (e.g. Fortran).[10]

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.[11]

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;
  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;
}

Polyline* createNewPolyline() {
  // create a polyline with points at (10,10) and (20,20)
  Polyline* polyline = new Polyline;
  Point* point1 = polyline->add_point();
  point1->set_x(10);
  point1->set_y(10);
  Point* point2 = 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#,[12] and Python.[13]

Protobuf 3.0 provides a code generator for C++, Java (including JavaNano, a dialect intended for low-resource environments), Python, Go, Ruby, Objective-C, C#.[14] It also supports JavaScript since 3.0.0-beta-2.[15]

Third-party implementations are also available for Ballerina,[16] C,[17][18] C++,[19] Dart, Elixir,[20][21] Erlang,[22] Haskell,[23] JavaScript,[24] Julia,[25] Nim,[26] Perl, PHP, Prolog,[27][28] R,[29] Rust,[30][31][32] Scala,[33] and Swift.[34]

See also

References

  1. ^ "Frequently Asked Questions | Protocol Buffers". Google Developers. Retrieved 2 October 2016.
  2. ^ "Releases - google/protobuf" – via GitHub.
  3. ^ Eishay Smith. "jvm-serializers Benchmarks". GitHub. Retrieved 2010-07-12.
  4. ^ Kenton Varda. "A response to Steve Vinoski". Retrieved 2008-07-14.
  5. ^ "grpc". grpc.io. Retrieved 2 October 2016.
  6. ^ "text_format.h - Protocol Buffers - Google Code". Retrieved 2012-03-02.
  7. ^ "Proto Best Practices | Protocol Buffers Documentation". Retrieved 2023-05-26.
  8. ^ "Overview". protobuf.dev. Retrieved 2023-05-28.
  9. ^ "Overview". protobuf.dev. Retrieved 2023-05-28.
  10. ^ "Overview". protobuf.dev. Retrieved 2023-05-28.
  11. ^ ThirdPartyAddOns - protobuf - Links to third-party add-ons. - Protocol Buffers - Google's data interchange format - Google Project Hosting. Code.google.com. Retrieved on 2013-09-18.
  12. ^ "Protocol Buffers in C#". Code Blockage. Retrieved 2017-05-12.
  13. ^ "Protocol Buffers Language Guide". Google Developers. Retrieved 2016-04-21.
  14. ^ "Language Guide (proto3) | Protocol Buffers". Google Developers. Retrieved 2020-08-09.
  15. ^ "Release Protocol Buffers v3.0.0-beta-2 · protocolbuffers/protobuf". GitHub. Retrieved 2020-08-09.
  16. ^ "Ballerina - GRPC". Archived from the original on 2021-11-15. Retrieved 2021-03-24.
  17. ^ "Nanopb - protocol buffers with small code size". Retrieved 2017-12-12.
  18. ^ "Protocol Buffers implementation in C". GitHub. Retrieved 2017-12-12.
  19. ^ "Embedded Proto - Protobuf for microcontrollers". Retrieved 2021-08-15.
  20. ^ "Protox". GitHub. 25 October 2021.
  21. ^ "Protobuf-elixir". GitHub. 26 October 2021.
  22. ^ "Tomas-abrahamsson/GPB". GitHub. 19 October 2021.
  23. ^ "Proto-lens". GitHub. 16 October 2021.
  24. ^ "Protocol Buffers for JavaScript". github.com. Retrieved 2016-05-14.
  25. ^ "ThirdPartyAddOns - protobuf - Links to third-party add-ons. - Protocol Buffers - Google's data interchange format - Google Project Hosting". Retrieved 2012-11-07.
  26. ^ "Protobuf implementation in pure Nim that leverages the power of the macro system to not depend on any external tools". GitHub. 21 October 2021.
  27. ^ "SWI-Prolog: Google's Protocol Buffers Library".
  28. ^ "SWI-Prolog / contrib-protobufs". GitHub. Retrieved 2022-04-21.
  29. ^ "RProtoBuf". GitHub.
  30. ^ "Rust-protobuf". GitHub. 26 October 2021.
  31. ^ "PROST!". GitHub. 21 August 2021.
  32. ^ "Quick-protobuf". GitHub. 12 October 2021.
  33. ^ "ScalaPB". GitHub. Retrieved 27 September 2022.
  34. ^ "Swift Protobuf". GitHub. 26 October 2021.

Read other articles:

Painting by George Bellows Cliff Dwellers (1913), oil on canvas by George Bellows Cliff Dwellers (1913) is an oil-on-canvas painting by George Bellows that depicts a colorful crowd on New York City's Lower East Side, on what appears to be a hot summer day. Its dimensions are 40+1⁄4 by 42+1⁄8 inches (102 cm × 107 cm), and it is in the collection of the Los Angeles County Museum of Art, which acquired it in 1916. The painting is a representative example of the Ashcan...

Melati untuk MarvelGenre Drama Roman PembuatMD EntertainmentSutradaraEncep MasdukiPemeran Chelsea Olivia Rezky Aditya Christ Laurent Neshia Putri Fendy Chow Gracia Indri Afifa Syahira Ryan Delon Penggubah lagu temaSetia BandLagu pembukaP.U.S.P.A (Putuskan Saja Pacarmu) — ST 12Lagu penutupP.U.S.P.A (Putuskan Saja Pacarmu) — ST 12Penata musikIwang ModulusNegara asalIndonesiaBahasa asliBahasa IndonesiaJmlh. musim2Jmlh. episode349 (daftar episode)ProduksiProduser Dhamoo Punjabi Manoj Pu...

OFNJT07JK01JO09JS09 Stasiun Ōfuna大船駅Pintu masuk barat JR East funa StationLokasi1 Ōfuna, Kamakura, Kanagawa(神奈川県鎌倉市大船一丁目)JepangKoordinat35°21′12″N 139°31′52″E / 35.35333°N 139.53111°E / 35.35333; 139.53111Koordinat: 35°21′12″N 139°31′52″E / 35.35333°N 139.53111°E / 35.35333; 139.53111PengelolaJR East, Shonan MonorailJalur JT Jalur Utama Tōkaidō JK Jalur Negishi JO Jalur Yokosuka JS Ja...

ЕннеріEnnery   Країна  Франція Регіон Гранд-Ест  Департамент Мозель  Округ Мец Кантон Віжі Код INSEE 57193 Поштові індекси 57365 Координати 49°13′36″ пн. ш. 6°13′03″ сх. д.H G O Висота 154 - 228 м.н.р.м. Площа 7,24 км² Населення 2230 (01-2020[1]) Густота 251,8 ос./км² Розміщення Влада

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (أغسطس 2018) جامعة ولاية أريزونا جامعة سنترال فلوريدا جامعة ولاية أوهايو جامعة فلوريدا الدولية جامعة تكساس إيه اند إم جامعة تكساس في أوستن جامعة ولاية ميشيغان جامعة فلو...

Frankfurter KranzAsalNegara asalTurki RincianJeniskue sponge Bahan utamakue sponge lbs Frankfurter Kranz atau Frankfurt Wreath adalah kue berbentuk bundar yang berasal dari Frankfurt, Jerman.[1] Kue ini terdiri dari bolu yang dipanggang dalam bentuk bundar, lalu dipotong menjadi 2-4 lapisan dan direkatkan bersama dengan krim mentega dan selai lalu didekorasi lagi dengan krim mentega dan ditaburi Krokant yaitu campuran kacang yang telah disangrai sampai kecoklatan dengan mentega dan gu...

جيمس باول كلارك (بالإنجليزية: James Paul Clarke)‏    معلومات شخصية الميلاد 18 أغسطس 1854  يازو سيتي  الوفاة 1 أكتوبر 1916 (62 سنة)   ليتل روك، أركنساس  مواطنة الولايات المتحدة  مناصب حاكم أركنساس (18 )   في المنصب8 يناير 1895  – 12 يناير 1897  ويليام ميد فيشباك  دانيال ...

This article includes a list of references, related reading, or external links, but its sources remain unclear because it lacks inline citations. Please help to improve this article by introducing more precise citations. (November 2018) (Learn how and when to remove this template message) You can help expand this article with text translated from the corresponding article in German. (September 2012) Click [show] for important translation instructions. View a machine-translated version of...

Former shipyard in Dunkirk, France Ateliers et Chantiers de FranceThe French destroyer Vauquelin sliding down the ways on 29 March 1931IndustryShipbuildingFoundedJuly 6, 1898 (1898-07-06) in Dunkirk, FranceDefunct1987HeadquartersDunkirk, France class=notpageimage| Location in France 51°02′52″N 2°22′31″E / 51.047762°N 2.375219°E / 51.047762; 2.375219 The Ateliers et Chantiers de France (ACF, Workshops and Shipyards of France) was a major ...

Malaysian automotive manufacturer This article is about a Malaysian automobile company. For the industrial town, see Proton City. For other uses, see Proton (disambiguation). This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article contains content that is written like an advertisement. Please help improve it by removing promotional content and inappropriate external links, and by add...

Railway museum at Tashkent, Uzbekistan This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (March 2016) (Learn how and when to remove this template message) This article relies largely or entirely on a single sou...

Berkas:File:GerSubU-81.jpeg Sejarah Jerman Nazi Nama U-81Dipesan 25 Januari 1939Pembangun Bremer Vulkan, Bremen-VegesackNomor galangan 9Pasang lunas 11 Mei 1940Diluncurkan 22 Februari 1941Mulai berlayar 26 April 1941Nasib Tenggelam pada tanggal 9 Januari 1944Catatan Bangkainya diangkat pada tanggal 22 April 1944 dan dibongkar[1] Ciri-ciri umum Kelas dan jenis Kapal selam Tipe VIICBerat benaman 769 t (757 ton panjang) (permukaan) 871 t (857 ton panjang) (menyelam)Panjang 67,1...

Sibyls beralih ke halaman ini. Untuk lukisan Italia 1514, lihat Sibyls (Raphael). Untuk kegunaan lain, lihat Sibyl (disambiguasi). Sibyl karya Francesco Ubertini, c. 1525 Sibyl adalah wanita yang bangsa Yunani kuno percayai sebagai orakel. Menurut legenda,[1] sibyl-sibyl awal dinabikan di tempat-tempat suci. Nubuat-nubuat mereka dipengaruhi oleh inspirasi ilahi dari seorang dewa; berawal di Delphi dan Pessinos, dewa-dewa tersebut adalah dewa khthonik. Pada Abad Kuno AKhir, berbagai pe...

Leuit, lumbung padi tradisional khas Kasepuhan di Sirnarasa, Kabupaten Sukabumi Kasepuhan Banten Kidul adalah kumpulan kelompok masyarakat adat sub-etnis Sunda yang tinggal di sekitar Gunung Halimun, terutama di wilayah Kabupaten Sukabumi sebelah barat hingga ke Kabupaten Lebak, dan ke utara hingga ke daerah selatan Kabupaten Bogor. Kata Kasepuhan (Sd. sepuh, tua) menunjuk pada adat istiadat lama yang masih dipertahankan dalam kehidupan sehari-hari masyarakatnya. Masyarakat Kasepuhan Banten K...

This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Frente Leste – news · newspapers · books · scholar · JSTOR (January 2012) (Learn how and when to remove thi...

Частотний гребінець — лазерне джерело світла зі спектром, що складається з серії дискретних, рівномірно віддалених частотних ліній. Існують різні способи генерації гребінця: періодична модуляція (амплітудна або фазова) лазера неперервної дії, чотирихвильове змішув...

This article relies largely or entirely on a single source. Relevant discussion may be found on the talk page. Please help improve this article by introducing citations to additional sources.Find sources: Alo Malau – news · newspapers · books · scholar · JSTOR (November 2020) Alo Malau is Heaven in Asian mythology. In the beliefs of the Kenyah of Borneo, it is where they go after death to be with their ancestors.[1] References ^ Museum, Sarawak...

Protein-coding gene in humans CACNB3IdentifiersAliasesCACNB3, CAB3, CACNLB3, calcium voltage-gated channel auxiliary subunit beta 3External IDsOMIM: 601958 MGI: 103307 HomoloGene: 20187 GeneCards: CACNB3 Gene location (Human)Chr.Chromosome 12 (human)[1]Band12q13.12Start48,813,794 bp[1]End48,828,941 bp[1]Gene location (Mouse)Chr.Chromosome 15 (mouse)[2]Band15 F1|15 54.64 cMStart98,528,721 bp[2]End98,542,410 bp[2]RNA expression patternBgeeHum...

Cuban-American radio and television host Javier RomeroRomero in 2022Born (1964-11-01) November 1, 1964 (age 59)Santa Clara, CubaNationalityCuban and AmericanCitizenshipCubaOccupation(s)Radio and television hostTelevisionSábado Gigante Javier Romero (born November 1, 1964) is a Cuban-American radio and television host. He works for WAMR-FM, where he hosts El Desayuno[1] and Univision.[2] He was previously the co-host of Sábado Gigante.[3] In 2021, he became the f...

Werner Haas Nazionalità  Germania Motociclismo Carriera Carriera nel Motomondiale Esordio 1952 Stagioni dal 1952 al 1954 Scuderie NSU Mondiali vinti 3 Gare disputate 21[1] Gare vinte 11 Podi 18 Giri veloci 11   Modifica dati su Wikidata · Manuale Werner Haas (Augusta, 30 maggio 1927 – Neuburg an der Donau, 13 novembre 1956) è stato un pilota motociclistico tedesco. Nel motomondiale ha vinto 11 gran premi e si è laureato campione del mondo 3 volte (2 in 250cc e 1 i...

Kembali kehalaman sebelumnya