2011-08-14 14 views
6

Me gustaría utilizar el búfer de protocolo en mi programa para leer datos de un archivo. También me gustaría poder editar el archivo de datos con cualquier editor de texto, para empezar (escribiré un editor de datos más tarde y cambiaré a binario completo).¿Puede el buffer del protocolo analizar un mensaje en formato "debug string"?

¿Hay alguna forma de analizar un formato legible para las personas? (cadena de depuración proporcionada por protobuf, o algún otro formato).

Respuesta

4

También hay un formato basado en texto, pero el soporte para esto es específico de la implementación. Por ejemplo, no lo soporto en absoluto en protobuf-net. Pero sí: tal está definido y discutido (por ejemplo) aquí: http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.text_format.html

Personalmente, prefiero usar binarios y escribir una IU alrededor del modelo.

+1

Gracias! Esto servirá, ya que es temporal. No necesito portabilidad ni compatibilidad a largo plazo en este punto, y escribiré un editor más adelante si es necesario. – Gnurfos

0

¿Estás seguro de que deseas utilizar ProtoBuf? Puede usar Json al principio, y luego cambiar a Bson o MessagePack como un formato binario.

La combinación Json/Bson tiene la ventaja de que puede usar la misma biblioteca (Json.net) para ellos. Creo que Bson es un poco más grande que ProtoBuf sin embargo.

O puede usar Json/MessagePack. Técnicamente, MessagePack es un mejor formato binario que Bson/ProtoBuf IMO. Pero el soporte de herramientas es peor, y necesitará una biblioteca separada para Json y MessagePack. Es compatible con todo lo que Json hace y más (en particular, puede utilizar tanto cadenas como enteros en los diccionarios).

Comparativa rápida de MsgPack y protobuf:

  • resultante tamaño de los datos si se utilizan construcciones similares parece ser comparable.
  • El rendimiento de codificación/decodificación depende en gran medida de la implementación, pero espero que tenga una magnitud similar
  • MsgPack es más autodescriptivo. . En ProtoBuf, ni siquiera ves si algo es un submensaje o un blob.
  • MsgPack admite claves no enteros en un diccionario. Una cosa que esto permite es almacenar propiedades por nombre cuando no te importa el tamaño y cambiar a enteros donde las ganancias son grandes.
  • MsgPack almacena el recuento de elementos en lugar del tamaño de matrices/diccionarios. Esto tiene la ventaja de que no es necesario regresar a la salida y adaptarse al tamaño todo el tiempo, lo que hace que escribir un serializador sea más fácil y, posiblemente, proporcione una velocidad de escritura más rápida. Por otro lado, no puede omitir fácilmente un elemento porque no conoce su tamaño.
  • MsgPack admite naturalmente un superconjunto de Json, por lo que puede migrar fácilmente desde Json.
  • El soporte de herramientas, la documentación y la popularidad son mucho mejores con ProtoBuf. En particular, ProtoBuf.net se ve mejor que el código C# disponible para MsgPack.
+0

Gracias por las alternativas, pero voy a intentar protobuf. Todas las soluciones se parecen bastante, para mis necesidades, así que simplemente elegí arbitrariamente una. – Gnurfos

+0

Tengo curiosidad: ¿qué matones en MsgPack ves como mejores? –

+0

@Marc Eso es más autodescriptivo definitivamente es una gran ventaja. En ProtoBuf, ni siquiera veo si algo es un submensaje o un blob. Las teclas del diccionario no entero también son agradables. Las otras diferencias son relativamente menores, pero en la mayoría de ellas prefiero un poco a MsgPack. – CodesInChaos

2

Si no les importa usar herramientas de línea de comandos, el Piqi project incluye piqi convert de comandos para convertir entre formatos 4: Los tampones protocolo binario, JSON, XML y Piq. El formato Piq está especialmente diseñado para ver y editar datos en un editor de texto.

0

La pregunta no especifica el lenguaje de programación, y mi respuesta es solo acerca de Java.

En Java, el método Message de la instancia toString devuelve un formato de texto legible para las personas.El mismo formato a continuación, se puede analizar en una instancia Message por TextFormat.merge:

String messageString = ... 
MyMessage.Builder builder = MyMessage.newBuilder(); 
TextFormat.merge(messageString, builder); 
MyMessage newMessage = builder.build(); 

(Variations of the merge method también se puede leer de una corriente, para evitar la lectura de toda la cadena del mensaje en la memoria.)

Cuestiones relacionadas