# Protocol Buffers

[Protocol Buffers](https://github.com/protocolbuffers/protobuf) es una herramienta para la serialización de estructuras de datos. La serialización es un proceso de codificación de un objeto en un medio de almacenamiento —como puede ser una archivo o un buffer en memoria— en ocasiones para transmitirlo a través de una conexión de red o para preservarlo entre ejecuciones de un programa. La serie de bytes que codifican el estado del objeto tras la serialización puede ser usada para crear un nuevo objeto, idéntico al original, tras aplicar el proceso inverso de deserialización.

[Protocol Buffers](https://github.com/protocolbuffers/protobuf) básicamente provee una manera sencilla de definir la estructura de los datos, pudieron entonces generar código capaz de leer y escribir dichos datos de manera eficiente, desde diferentes lenguajes y en una variedad de distintos tipos de flujos de datos.

Fue desarrollado internamente por Google para almacenar e intercambiar todo tipo de información estructurada. Hasta el punto de que sirve de base para un sistema de [llamada a procedimiento remoto](http://es.wikipedia.org/wiki/Remote_Procedure_Call) o [RPC](http://es.wikipedia.org/wiki/Remote_Procedure_Call) (Remote Procedure Call) propio que es usado prácticamente para todas las comunicaciones entre equipos en Google.

En su momento, Google hizo generadores de código de [Protocol Buffers](https://github.com/protocolbuffers/protobuf) para C++, Java y Python y liberó la herramienta con una licencia [BSD](http://es.wikipedia.org/wiki/Licencia_BSD)

# Alternativas

La idea detrás de [Protocol Buffers](https://github.com/protocolbuffers/protobuf) es muy similar a la que dio origen a [XML](http://en.wikipedia.org/wiki/XML), solo que en este caso el formato es binario, compacto y pone énfasis en la velocidad a la hora de serializar y deserializar los datos.

<details data-node-type="hn-details-summary"><summary>ℹ️¿Qué es serializar y deserializar?</summary><div data-type="detailsContent">La serialización es un proceso de codificación de un objeto en un medio de almacenamiento —como puede ser una archivo o un buffer en memoria— en ocasiones para transmitirlo a través de una conexión de red o para preservarlo entre ejecuciones de un programa. La serie de bytes que codifican el estado del objeto tras la serialización puede ser usada para crear un nuevo objeto, idéntico al original, tras aplicar el proceso inverso de deserialización.</div></details>

Además, es muy similar a [Apache Thrift](http://en.wikipedia.org/wiki/Apache_Thrift) —creado y usado internamente por Facebook— o [Apache Avro](http://en.wikipedia.org/wiki/Apache_Avro), excepto porque [Protocol Buffers](https://github.com/protocolbuffers/protobuf) no define un protocolo [RPC](http://es.wikipedia.org/wiki/Remote_Procedure_Call) concreto, sino solo como deben empaquetarse los datos.

Si se quiere definir un servicio [RPC](http://es.wikipedia.org/wiki/Remote_Procedure_Call) que haga uso de un protocolo que se apoye sobre [Protocol Buffers](https://github.com/protocolbuffers/protobuf) para el intercambio de datos, existen [diversas implementaciones RPC](https://github.com/protocolbuffers/protobuf/blob/main/docs/third_party.md#rpc-implementations) para distintos lenguajes de programación.

# Referencias

* [Protocol Buffers](https://protobuf.dev/) — Protocol Buffers Documentation
    
* [protobuf](https://github.com/protocolbuffers/protobuf) — GitHub
    
* [Protocol Buffers](http://en.wikipedia.org/wiki/Protocol_Buffers) — Wikipedia
