¿Debo usar un binario o un archivo de texto para almacenar mensajes protobuf?

StackOverflow https://stackoverflow.com/questions/1859267

  •  13-09-2019
  •  | 
  •  

Pregunta

Uso de Google protobuf, estoy ahorrando mis datos serializados contactado a un archivo - en cada archivo hay varios mensajes. Tenemos versiones tanto C ++ y Python del código, así que tenemos que utilizar las funciones protobuf que están disponibles en ambos idiomas. He experimentado con el uso SerializeToArray y SerializeAsString y no parece ser las siguientes condiciones lamentables:

  1. SerializeToArray: Como se sugiere en una respuesta, la mejor manera de utilizar esto es para prefijar cada mensaje con su tamaño de los datos. Esto sería un gran trabajo para C ++, pero en Python que no parece que esto es posible - me equivoco

  2. ?
  3. SerializeAsString: Esto genera una cadena en serie equivalente a su homólogo binario - que puedo guardar en un archivo, pero ¿qué ocurre si uno de los personajes en el resultado de serialización es \ n - ¿Cómo podemos encontrar los finales de línea, o el final de los mensajes para el caso?

Actualización:

Por favor, permítanme reformular ligeramente. Como yo lo entiendo, no puedo escribir datos binarios en C ++ porque entonces nuestra aplicación Python no puede leer los datos, ya que sólo puede analizar la cadena de mensajes serializados. ¿Debo entonces en vez utilizar SerializeAsString en C ++ y Python? Si es así, ¿es la mejor práctica para almacenar dichos datos en un archivo de texto en lugar de un archivo binario? Mi primera impresión es binario, pero como se puede ver esto no se ve como una opción.

¿Fue útil?

Solución

La mejor práctica para concatenar los mensajes de esta manera es anteponer cada mensaje con su tamaño. De esa manera se lee en el tamaño (probar un int de 32 bits o algo así), entonces lea ese número de bytes en un búfer y deserializar ella. A continuación, lea el siguiente tamaño, etc., etc.

Lo mismo ocurre con la escritura, primero escribir el tamaño del mensaje, entonces el mensaje en sí mismo.

Transmisión de varios mensajes en la documentación para obtener más protobuf información.

Otros consejos

Hemos tenido un gran éxito en base64 codifican los mensajes, y utilizando un simple \ n para separar los mensajes. Esto ofcoirse dependerá mucho de su uso - necesitamos almacenar los mensajes en ficheros "log". Como es natural, tiene codificación sobrecarga / decodificación de esto -. Pero esto no ha sido ni remotamente un problema para nosotros

La ventaja de mantener estos mensajes como línea separadas texto ha sido hasta ahora muy valiosa para el mantenimiento y la depuración. Averiguar cuántos mensajes se encuentran en un archivo? wc -l. Encontrar el mensaje enésimo - head ... | tail. Averiguar qué le pasa a un registro en un sistema remoto que necesita para acceder a través de 2 VPN y una solución de Citrix? Copiar el mensaje y enviarlo por correo al programador.

Protobuf es un formato binario, por lo que la lectura y la escritura debe hacerse como binario, no en el texto. Si no desea que el formato binario, se debe considerar el uso de algo que no sea protobuf (hay un montón de formatos de datos textual, como XML, JSON, CSV); simplemente usando abstracciones de texto no es suficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top