Protokolové vyrovnávací paměti - Protocol Buffers
Vývojáři | |
---|---|
První vydání | Začátek roku 2001 (interní) 7. července 2008 (veřejný) |
Stabilní uvolnění | |
Ú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 |
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.cc
a example.pb.h
jsou 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, protoc
který 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
- Oficiální dokumentace na developers.google.com
- protobuf na GitHub