Buffers de protocolo - Protocol Buffers

Buffers de protocolo
Desenvolvedor (s) Google
lançamento inicial Início de 2001 (interno)
, 7 de julho de 2008 (público) ( 07/07/2008 )
Versão estável
3.17.3  Edite isso no Wikidata / 8 de junho de 2021 ; 3 meses atrás ( 8 de junho de 2021 )
Repositório
Escrito em C ++, C #, Java, Python, JavaScript, Ruby, Go, PHP, Dart
Sistema operacional Algum
Plataforma Plataforma cruzada
Modelo formato e biblioteca de serialização, compilador IDL
Licença BSD
Local na rede Internet developers .google .com / protocol-buffers / Edite isso no Wikidata

Protocol Buffers ( Protobuf ) é uma biblioteca de plataforma cruzada gratuita e de código aberto usada para serializar dados estruturados. É útil no desenvolvimento de programas para se comunicarem entre si por meio de uma rede ou para armazenar dados. O método envolve uma linguagem de descrição de interface que descreve a estrutura de alguns dados e um programa que gera o código-fonte dessa descrição para gerar ou analisar um fluxo de bytes que representa os dados estruturados.

Visão geral

O Google desenvolveu Protocol Buffers para uso interno e forneceu um gerador de código para vários idiomas sob uma licença de código aberto (veja abaixo ).

Os objetivos de design para Buffers de protocolo enfatizaram a simplicidade e o desempenho. Em particular, ele foi projetado para ser menor e mais rápido que o XML .

Buffers de protocolo são amplamente usados ​​no Google para armazenar e trocar todos os tipos de informações estruturadas. O método serve como base para um sistema de chamada de procedimento remoto personalizado (RPC) que é usado para quase todas as comunicações entre máquinas no Google.

Os buffers de protocolo são semelhantes aos protocolos Apache Thrift (usado pelo Facebook, Evernote ), Ion (criado pela Amazon) ou Microsoft Bond, oferecendo também uma pilha de protocolos RPC concreta para usar para serviços definidos chamados gRPC .

Estruturas de dados (chamadas de mensagens ) e serviços são descritos em um arquivo de definição de protótipo ( .proto) e compilados com protoc. Essa compilação gera código que pode ser invocado por um remetente ou destinatário dessas estruturas de dados. Por exemplo, example.pb.cce example.pb.hsão gerados a partir de example.proto. Eles definem classes C ++ para cada mensagem e serviço em example.proto.

Canonicamente, as mensagens são serializadas em um formato de fio binário que é compacto, compatível com versões anteriores e posteriores, mas não autodescritivo (ou seja, não há como dizer os nomes, significado ou tipos de dados completos dos campos sem uma especificação externa ) Não há uma maneira definida de incluir ou referir-se a tal especificação externa ( esquema ) em um arquivo de buffers de protocolo. A implementação com suporte oficial inclui um formato de serialização ASCII, mas esse formato - embora autodescritivo - perde o comportamento de compatibilidade com versões anteriores e posteriores e, portanto, não é uma boa escolha para aplicativos além de depuração.

Embora o objetivo principal dos Buffers de protocolo seja facilitar a comunicação de rede, sua simplicidade e velocidade tornam os Buffers de protocolo uma alternativa às classes e estruturas C ++ centradas em dados, especialmente onde a interoperabilidade com outras linguagens ou sistemas pode ser necessária no futuro.

Exemplo

Um esquema para um uso específico de buffers de protocolo associa tipos de dados a nomes de campo, usando números inteiros para identificar cada campo. (Os dados do buffer de protocolo contêm apenas os números, não os nomes dos campos, proporcionando alguma economia de largura de banda / armazenamento em comparação com os sistemas que incluem os nomes dos campos nos dados.)

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

A mensagem "Point" define dois itens de dados obrigatórios, x e y . O rótulo do item de dados é opcional. Cada item de dados possui uma tag. A tag é definida após o sinal de igual. Por exemplo, x tem a tag 1.

As mensagens "Line" e "Polyline", que usam Point, demonstram como a composição funciona em buffers de protocolo. Polyline tem um campo repetido , que se comporta como um vetor.

Este esquema pode ser subsequentemente compilado para uso por uma ou mais linguagens de programação. O Google fornece um compilador chamado protocque pode produzir saída para C ++, Java ou Python. Outros compiladores de esquema estão disponíveis em outras fontes para criar saída dependente do idioma para mais de 20 outros idiomas.

Por exemplo, depois que uma versão C ++ do esquema de buffer de protocolo acima é produzida, um arquivo de código-fonte C ++, polyline.cpp, pode usar os objetos de mensagem da seguinte maneira:

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

Suporte de linguas

Protobuf 2.0 fornece um gerador de código para C ++ , Java , C # e Python .

Protobuf 3.0 fornece um gerador de código para C ++ , Java (incluindo JavaNano, um dialeto destinado a ambientes de poucos recursos ), Python , Go , Ruby , Objective-C , C # . Ele também suporta JavaScript desde 3.0.0-beta-2.

Implementações de terceiros também estão disponíveis para Ballerina , C , C ++ , Dart , Elixir , Erlang , Haskell , JavaScript , Perl , PHP , R , Rust , Scala , Swift , Julia e Nim .


Veja também

Referências

links externos