Protokolbuffere - Protocol Buffers
| Udvikler (er) | |
|---|---|
| Første udgivelse | Tidligt i 2001 (internt) 7. juli 2008 (offentligt) |
| Stabil udgivelse | |
| Depot | |
| Skrevet i | C ++, C#, Java, Python, JavaScript, Ruby, Go, PHP, Dart |
| Operativ system | Nogen |
| Platform | På tværs af platforme |
| Type | serialiseringsformat og bibliotek, IDL -kompilator |
| Licens | BSD |
| Internet side |
udviklere |
Protocol Buffers ( Protobuf ) er et gratis og open source cross-platform bibliotek, der bruges til at serialisere strukturerede data. Det er nyttigt i udviklingen af programmer til at kommunikere med hinanden over et netværk eller til lagring af data. Metoden involverer et grænsefladebeskrivelsessprog, der beskriver strukturen af nogle data og et program, der genererer kildekode fra denne beskrivelse til generering eller parsing af en strøm af bytes, der repræsenterer de strukturerede data.
Oversigt
Google udviklede protokolbuffere til intern brug og leverede en kodegenerator til flere sprog under en open source -licens (se nedenfor ).
Designmålene for protokolbuffere understregede enkelhed og ydeevne. Især blev den designet til at være mindre og hurtigere end XML .
Protokolbuffere bruges i vid udstrækning hos Google til lagring og udveksling af alle former for struktureret information. Metoden fungerer som grundlag for et brugerdefineret fjernprocedureopkaldssystem (RPC), der bruges til næsten al kommunikation mellem maskiner hos Google.
Protokolbuffere ligner Apache Thrift (brugt af Facebook, Evernote ), Ion (oprettet af Amazon) eller Microsoft Bond -protokoller og tilbyder også en konkret RPC -protokolstabel til brug for definerede tjenester kaldet gRPC .
Datastrukturer (kaldet meddelelser ) og tjenester beskrives i en proto -definitionsfil ( .proto) og kompileres med protoc. Denne samling genererer kode, der kan påberåbes af en afsender eller modtager af disse datastrukturer. For eksempel example.pb.ccog example.pb.her genereret fra example.proto. De definerer C ++ - klasser for hver besked og service i example.proto.
Kanonisk serieliseres meddelelser til et binært trådformat , der er kompakt, fremad- og bagudkompatibelt, men ikke selvbeskrivende (det vil sige, at der ikke er nogen måde at fortælle navne, betydning eller fulde datatyper af felter uden en ekstern specifikation ). Der er ingen defineret måde at inkludere eller henvise til en sådan ekstern specifikation ( skema ) i en Protocol Buffers -fil. Den officielt understøttede implementering indeholder et ASCII-serialiseringsformat, men dette format-selvom det er selvbeskrivende-mister adfærd frem og tilbage og er derfor ikke et godt valg til andre applikationer end fejlretning.
Selvom det primære formål med protokolbuffere er at lette netværkskommunikation, gør dets enkelhed og hastighed protokolbuffere til et alternativ til datacentriske C ++-klasser og strukturer, især når interoperabilitet med andre sprog eller systemer kan være nødvendig i fremtiden.
Eksempel
Et skema til en særlig brug af protokolbuffere forbinder datatyper med feltnavne ved hjælp af heltal til at identificere hvert felt. (Protokolbufferdata indeholder kun tallene, ikke feltnavne, hvilket giver nogle båndbredde/lagringsbesparelser sammenlignet med systemer, der inkluderer feltnavne i dataene.)
//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;
}
Meddelelsen "Punkt" definerer to obligatoriske dataelementer, x og y . Den dataelementet etiket er valgfrit. Hvert dataelement har et mærke. Mærket defineres efter lighedstegnet. For eksempel har x mærket 1.
Meddelelserne "Line" og "Polyline", som begge bruger Point, demonstrerer, hvordan sammensætning fungerer i protokolbuffere. Polyline har et gentaget felt, der opfører sig som en vektor.
Dette skema kan efterfølgende kompileres til brug for et eller flere programmeringssprog. Google leverer en compiler kaldet, protocsom kan producere output til C ++, Java eller Python. Andre skemakompilatorer er tilgængelige fra andre kilder for at oprette sprogafhængigt output til over 20 andre sprog.
For eksempel, efter at en C ++ - version af protokolbufferskemaet ovenfor er produceret, kan en C ++ - kildekodefil, polyline.cpp, bruge meddelelsesobjekterne som følger:
// 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;
}
Sprogstøtte
Protobuf 2.0 giver en kodegenerator til C ++ , Java , C# og Python .
Protobuf 3.0 leverer en kodegenerator til C ++ , Java (inklusive JavaNano, en dialekt beregnet til miljøer med lav ressource ), Python , Go , Ruby , Objective-C , C# . Det understøtter også JavaScript siden 3.0.0-beta-2.
Tredjepartsimplementeringer er også tilgængelige til Ballerina , C , C ++ , Dart , Elixir , Erlang , Haskell , JavaScript , Perl , PHP , R , Rust , Scala , Swift , Julia og Nim .
Se også
Referencer
eksterne links
- Officiel dokumentation på developers.google.com
- protobuf på GitHub