Articulo de referencia

Buffers de protocolo

{{cite web|title=Frequently Asked Questions {{!}} Protocol Buffers|url=https://developers.google.com/protocol-buffers/docs/faq|website=[[Google Developers]]|access-date=2 Octobe...

Protocol Buffers ( Protobuf ) es un formato de datos multiplataforma, gratuito y de código abierto, utilizado para serializar datos estructurados. Resulta útil para desarrollar programas que se comunican entre sí a través de una red o para almacenar datos. El método consiste en un lenguaje de descripción de interfaz que describe la estructura de los datos y un programa que genera código fuente a partir de dicha descripción para generar o analizar una secuencia de bytes que representa los datos estructurados.

Descripción general

Google desarrolló Protocol Buffers para uso interno y proporcionó un generador de código para varios lenguajes bajo una licencia de código abierto .

Los objetivos de diseño de Protocol Buffers enfatizaron la simplicidad y el rendimiento. En particular, se diseñó para ser más pequeño y rápido que XML . [ 3 ]

Protocol Buffers se utiliza ampliamente en Google para almacenar e intercambiar todo tipo de información estructurada. Este método sirve de base para un sistema personalizado de llamadas a procedimientos remotos (RPC) que se utiliza para casi toda la comunicación entre máquinas en Google. [ 4 ]

Protocol Buffers es similar a los protocolos Apache Thrift , Amazon Ion y Microsoft Bond, y ofrece una pila de protocolos RPC concreta para usar con servicios definidos llamada gRPC . [ 5 ]

Los esquemas de estructuras de datos (llamados mensajes ) y los servicios se describen en un archivo de definición proto ( .proto) y se compilan con protoc. Esta compilación genera código que puede ser invocado por un remitente o receptor de estas estructuras de datos. Por ejemplo, example.pb.ccy example.pb.hse generan a partir de example.proto. Definen clases C++ para cada mensaje y servicio en example.proto.

Canónicamente, los mensajes se serializan en un formato binario compacto, compatible hacia adelante y hacia atrás , pero no autodescriptivo (es decir, no hay forma de conocer los nombres, el significado o los tipos de datos completos de los campos sin una especificación externa). No existe una forma definida de incluir o hacer referencia a dicha especificación externa ( esquema ) dentro de un archivo de Protocol Buffers. La implementación oficialmente compatible incluye un formato de serialización ASCII , [ 6 ] pero este formato, aunque autodescriptivo, pierde la compatibilidad hacia adelante y hacia atrás, por lo que no es una buena opción para aplicaciones distintas a la edición y depuración manual. [ 7 ]

Si bien el objetivo principal de Protocol Buffers es facilitar la comunicación en red, su simplicidad y velocidad lo convierten en una alternativa a las clases y estructuras de C++ centradas en datos, especialmente cuando se requiere interoperabilidad con otros lenguajes o sistemas en el futuro.

Limitaciones

Los protobufs no tienen una especificación única. [ 8 ] El formato es más adecuado para pequeños fragmentos de datos que no superan unos pocos megabytes y que se pueden cargar/enviar a la memoria de inmediato y, por lo tanto, no es un formato de transmisión continua. [ 9 ] La biblioteca no proporciona compresión de forma predeterminada. El formato tampoco es compatible con lenguajes no orientados a objetos (por ejemplo, Fortran ). [ 10 ]

Ejemplo

Un esquema para un uso específico de los búferes de protocolo asocia los tipos de datos con los nombres de los campos, utilizando números enteros para identificar cada campo. (Los datos del búfer de protocolo contienen solo los números, no los nombres de los campos, lo que proporciona cierto ahorro de ancho de banda y almacenamiento en comparación con los sistemas que incluyen los nombres de los campos en los datos).

// polyline.proto syntax = "proto2" ;Mensaje Punto { requerido int32 x = 1 ; requerido int32 y = 2 ; opcional cadena etiqueta = 3 ; }Mensaje Línea { Punto requerido inicio = 1 ; Punto requerido fin = 2 ; Etiqueta de cadena opcional = 3 ; }mensaje Polilínea { repetido Punto punto = 1 ; opcional cadena etiqueta = 2 ; }

El Pointmensaje define dos elementos de datos obligatorios, xy y. El elemento de datos labeles opcional. Cada elemento de datos tiene una etiqueta. La etiqueta se define después del signo igual. Por ejemplo, xtiene la etiqueta 1.

Los mensajes y , que ambos utilizan Line, demuestran cómo funciona la composición en Protocol Buffers. tiene un campo y, por lo tanto, se comporta como un conjunto de puntos (de número no especificado).PolylinePointPolylinerepeatedPolyline

Este esquema puede compilarse posteriormente para su uso con uno o más lenguajes de programación. Google proporciona un compilador protocque puede generar código para C++, Java o Python. Existen otros compiladores de esquemas disponibles en otras fuentes para generar código dependiente del lenguaje para más de 20 lenguajes adicionales. [ 11 ]

Por ejemplo, después de generar una versión en C++ del esquema de búfer de protocolo anterior, un archivo de código fuente en C++, polyline.cpp , puede utilizar los objetos de mensaje de la siguiente manera:

// polyline.cpp #include "polyline.pb.h" // generado al llamar a "protoc polyline.proto"importar std ;usando std :: string ; usando std :: shared_ptrshared_ptr < Line > createNewLine ( const string & name ) { // crea una línea desde (10, 20) hasta (30, 40) shared_ptr < Line > line = std :: make_shared < 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 ; }shared_ptr < Polyline > createNewPolyline () { // crea una polilínea con puntos en (10,10) y (20,20) shared_ptr < Polyline > polyline = std :: make_shared < Polyline > (); shared_ptr < Point > point1 = std :: make_shared < Point > ( polyline -> add_point ()); point1 -> set_x ( 10 ); point1 -> set_y ( 10 ); shared_ptr < Point > point2 = std :: make_shared < Point > ( polyline -> add_point ()); point2 -> set_x ( 20 ); point2 -> set_y ( 20 ); return polyline ; }

Soporte de idiomas

Protobuf 2.0 proporciona un generador de código para C++ , Java , C# , [ 12 ] y Python . [ 13 ]

Protobuf 3.0 proporciona un generador de código para C++ , Java (incluido JavaNano, un dialecto destinado a entornos con pocos recursos ), Kotlin , Python , Go , Ruby , Objective-C , C# , PHP y Dart . [ 14 ] También admite JavaScript desde la versión 3.0.0-beta-2. [ 15 ]

También hay implementaciones de terceros disponibles para Ada , [ 16 ] Ballerina , [ 17 ] C , [ 18 ] [ 19 ] C++ , [ 20 ] Dart , Elixir , [ 21 ] [ 22 ] Erlang , [ 23 ] Haskell , [ 24 ] JavaScript , [ 25 ] Julia , [ 26 ] Nim , [ 27 ] Perl , PHP , Prolog , [ 28 ] [ 29 ] R , [ 30 ] Rust , [ 31 ] [ 32 ] [ 33 ] Scala , [ 34 ] y Swift . [ 35 ]

Véase también

Referencias

  1. "Preguntas frecuentes | Protocol Buffers" . Google Developers . Consultado el 2 de octubre de 2016 .
  2. "Versiones - google/protobuf" vía GitHub .
  3. Eishay Smith. "jvm-serializers Benchmarks" . GitHub . Consultado el 12 de julio de 2010 .
  4. Kenton Varda. "Una respuesta a Steve Vinoski" . Consultado el 14 de julio de 2008 .
  5. "grpc" . grpc.io. Consultado el 2 de octubre de 2016 .
  6. "text_format.h - Protocol Buffers - Google Code" . Consultado el 2 de marzo de 2012 .
  7. "Proto Best Practices | Documentación de Protocol Buffers" . Consultado el 26 de mayo de 2023 .
  8. "Descripción general" . protobuf.dev . Consultado el 28 de mayo de 2023 .
  9. "Descripción general" . protobuf.dev . Consultado el 28 de mayo de 2023 .
  10. "Descripción general" . protobuf.dev . Consultado el 28 de mayo de 2023 .
  11. ThirdPartyAddOns - protobuf - Enlaces a complementos de terceros. - Protocol Buffers - Formato de intercambio de datos de Google - Google Project Hosting . Code.google.com. Consultado el 18 de septiembre de 2013.
  12. "Protocol Buffers en C#" . Bloqueo de código . Consultado el 12 de mayo de 2017 .
  13. "Guía del lenguaje de búferes de protocolo" . Google Developers . Consultado el 21 de abril de 2016 .
  14. "Guía del lenguaje (proto3) | Protocol Buffers" . Google Developers . Consultado el 9 de agosto de 2020 .
  15. "Release Protocol Buffers v3.0.0-beta-2 · protocolbuffers/protobuf" . GitHub . Consultado el 09-08-2020 .
  16. "La implementación de Google Protocol Buffers en Ada" .
  17. "Bailarina - GRPC" . Archivado del original el 15/11/2021 . Consultado el 24/03/2021 .
  18. "Nanopb - búferes de protocolo con tamaño de código pequeño" . Consultado el 12 de diciembre de 2017 .
  19. "Implementación de Protocol Buffers en C" . GitHub . Consultado el 12 de diciembre de 2017 .
  20. "Embedded Proto - Protobuf para microcontroladores" . Consultado el 15 de agosto de 2021 .
  21. "Protox" . GitHub . 25 de octubre de 2021.
  22. «Protobuf-elixir» . GitHub . 26 de octubre de 2021.
  23. «Tomás-abrahamsson/GPB» . GitHub . 19 de octubre de 2021.
  24. "Proto-lens" . GitHub . 16 de octubre de 2021.
  25. "Protocol Buffers para JavaScript" . github.com . Consultado el 14 de mayo de 2016 .
  26. "ThirdPartyAddOns - protobuf - Enlaces a complementos de terceros. - Protocol Buffers - Formato de intercambio de datos de Google - Google Project Hosting" . Consultado el 7 de noviembre de 2012 .
  27. "Implementación de Protobuf en Nim puro que aprovecha la potencia del sistema de macros para no depender de herramientas externas" . GitHub . 21 de octubre de 2021.
  28. "SWI-Prolog: Biblioteca de Protocol Buffers de Google" .
  29. "SWI-Prolog / contrib-protobufs" . GitHub . Consultado el 21 de abril de 2022 .
  30. "RProtoBuf" . GitHub .
  31. "Rust-protobuf" . GitHub . 26 de octubre de 2021.
  32. "¡SALUD!" . GitHub . 14 de noviembre de 2025.
  33. "Quick-protobuf" . GitHub . 12 de octubre de 2021.
  34. "ScalaPB" . GitHub . Consultado el 27 de septiembre de 2022 .
  35. "Swift Protobuf" . GitHub . 26 de octubre de 2021.
  • Documentación oficial en developers.google.com
  • protobuf en GitHub