Protokolové vyrovnávací paměti - Protocol Buffers

Protokolové vyrovnávací paměti
Vývojáři Google
První vydání Začátek roku 2001 (interní)
7. července 2008 (veřejný) ( 2008-07-07 )
Stabilní uvolnění
3.17.3  Upravte to na Wikidata / 8. června 2021 ; před 3 měsíci ( 8. června 2021 )
Úložiště
Napsáno C ++, C#, Java, Python, JavaScript, Ruby, Go, PHP, Dart
Operační systém Žádný
Plošina Cross-platform
Typ serializační formát a knihovna, kompilátor IDL
Licence BSD
webová stránka vývojáři .google .com /protocol-buffers / Upravte to na Wikidata

Protocol Buffers ( Protobuf ) je bezplatná a open source multiplatformní knihovna sloužící k serializaci strukturovaných dat. Je to užitečné při vývoji programů pro vzájemnou komunikaci po síti nebo pro ukládání dat. Metoda zahrnuje jazyk popisu rozhraní, který popisuje strukturu některých dat, a program, který z tohoto popisu generuje zdrojový kód pro generování nebo analýzu proudu bajtů, který představuje strukturovaná data.

Přehled

Google vyvinul vyrovnávací paměti protokolů pro interní použití a poskytl generátor kódu pro více jazyků pod licencí open source (viz níže ).

Cíle návrhu pro Protocol Buffers kladly důraz na jednoduchost a výkon. Zejména byl navržen tak, aby byl menší a rychlejší než XML .

Protokolové vyrovnávací paměti jsou ve společnosti Google široce používány k ukládání a výměně všech druhů strukturovaných informací. Tato metoda slouží jako základ pro vlastní systém vzdáleného volání procedur (RPC), který se používá pro téměř veškerou komunikaci mezi stroji na Googlu.

Protokolové vyrovnávací paměti jsou podobné protokolům Apache Thrift (používají Facebook, Evernote ), Ion (vytvořené společností Amazon) nebo Microsoft Bond a nabízejí také konkrétní zásobník protokolů RPC, který lze použít pro definované služby nazývané gRPC .

Datové struktury (nazývané zprávy ) a služby jsou popsány v souboru definice proto ( .proto) a kompilovány s protoc. Tato kompilace generuje kód, který může vyvolat odesílatel nebo příjemce těchto datových struktur. Například, example.pb.cca example.pb.hjsou generovány z example.proto. Definují třídy C ++ pro každou zprávu a službu v example.proto.

Kanonicky jsou zprávy serializovány do binárního drátového formátu, který je kompaktní, kompatibilní vpřed i zpět, ale není popisovatelný (to znamená, že neexistuje způsob, jak zjistit názvy, význam nebo úplné datové typy polí bez externí specifikace ). Neexistuje žádný definovaný způsob, jak zahrnout nebo odkazovat na takovou externí specifikaci ( schéma ) v souboru vyrovnávacích pamětí protokolů. Oficiálně podporovaná implementace obsahuje formát serializace ASCII, ale tento formát-i když se sám popisuje-ztrácí chování kompatibility vpřed i vzad, a není proto dobrou volbou pro jiné aplikace než pro ladění.

Přestože je primárním účelem vyrovnávacích pamětí protokolů usnadnit síťovou komunikaci, její jednoduchost a rychlost činí z vyrovnávacích pamětí protokolů alternativu k třídám a strukturám C ++ zaměřeným na data, zejména tam, kde by v budoucnu mohla být zapotřebí interoperabilita s jinými jazyky nebo systémy.

Příklad

Schéma pro konkrétní použití vyrovnávacích pamětí protokolů spojuje datové typy s názvy polí pomocí celých čísel k identifikaci každého pole. (Data vyrovnávací paměti protokolu obsahují pouze čísla, nikoli názvy polí, což poskytuje určité úspory šířky pásma/úložiště ve srovnání se systémy, které v datech obsahují názvy polí.)

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

Zpráva „Bod“ definuje dvě povinné datové položky, x a y . Štítek datové položky je volitelný. Každá datová položka má značku. Značka je definována za znaménkem rovnosti. Například x má značku 1.

Zprávy „Line“ a „Polyline“, které obě používají Point, ukazují, jak kompozice funguje ve vyrovnávacích pamětech protokolů. Křivka má opakované pole, které se chová jako vektor.

Toto schéma lze následně zkompilovat pro použití v jednom nebo více programovacích jazycích. Google poskytuje kompilátor s názvem, protockterý může produkovat výstup pro C ++, Java nebo Python. Jiné kompilátory schémat jsou k dispozici z jiných zdrojů a vytvářejí výstup závislý na jazyce pro více než 20 dalších jazyků.

Například poté, co je vytvořena verze C ++ schématu vyrovnávací paměti protokolu výše, může soubor zdrojového kódu C ++, polyline.cpp, použít objekty zpráv následujícím způsobem:

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

Jazyková podpora

Protobuf 2.0 poskytuje generátor kódu pro C ++ , Java , C# a Python .

Protobuf 3.0 poskytuje generátor kódu pro C ++ , Java (včetně JavaNano, dialektu určeného pro prostředí s nízkými zdroji ), Python , Go , Ruby , Objective-C , C# . Podporuje také JavaScript od verze 3.0.0-beta-2.

Implementace třetích stran jsou k dispozici také pro Ballerina , C , C ++ , Dart , Elixir , Erlang , Haskell , JavaScript , Perl , PHP , R , Rust , Scala , Swift , Julia a Nim .


Viz také

Reference

externí odkazy