serialization - Diferencia entre los bonos de Microsoft y los búferes de protocolo de Google
marshalling protocol-buffers (1)
Recientemente (enero de 2015) Microsoft open-sourced Bond , su marco para trabajar con datos esquematizados. En muchos aspectos es similar a los Protocol Buffers de Google.
¿Cuáles son las mayores diferencias entre los dos? ¿Cuáles son los pros y los contras, es decir, en qué situaciones me gustaría usar una, pero no la otra? Por supuesto, no estoy hablando de cosas obvias como la coherencia con otros proyectos o las API ya existentes, sino las características de ambas bibliotecas. Para dar un ejemplo, Bond ha bonded<T>
que, si recuerdo bien, no tiene una contraparte en Protocol Buffers.
En general, Bond tiene un mejor sistema de tipos y soporta múltiples protocolos.
En particular, los profesionales son:
- Bond soporta genéricos
- Bond tiene diferentes tipos para representar colecciones:
vector<T>
,map<T>
,list<T>
- Bond admite la deserialización perezosa de tipo seguro (
bonded<T>
) - Bond admite múltiples formatos (binario rápido, binario compacto, XML, JSON) + cálculo de referencias y transcodificación
Contras:
- Bond no admite tipos diferentes para la codificación de enteros fijos y variables. En Bond, la forma en que se codifican los enteros está determinada por el formato de salida (rápido o compacto), pero en los búferes de protocolo, hay tipos de enteros que siempre tienen un tamaño fijo:
fixed32
yfixed64
. - Bond no admite tipos de unión (uno de ellos en Protocol Buffers)
- Bond no tiene implementación de Java (todavía)
Hice algunas pruebas, y parece que el tamaño de los mensajes simples en los formatos binarios de Bond y ProtoBuf son casi iguales. Comparé el tiempo de serialización y deserialización utilizando la biblioteca ProtoBuf de Bond y C #: en mi caso, Bond se desempeñó un poco mejor, puede encontrar mi código fuente en GitHub
Para resumir, creo que es mejor usar Bond cuando trabaja con algunos tipos de datos complejos o cuando necesita representar los mismos datos en diferentes formatos: por ejemplo, almacenar como binarios, pero exponer como JSON, etc.