2010-05-12 20 views
6

Al usar Buffers de Protocolo de Google, ¿puedo establecer un tamaño máximo para todos los mensajes que codifico?Buffers de protocolo de Google - ¿Buffer de tamaño fijo?

si sé que lo que codigo nunca es más grande que X bytes, entonces Google Protobuffs siempre produciría un buffer de tamaño Y, y si le doy una cantidad de datos menor, acóplelo al tamaño Y?

Respuesta

5

El formato de conexión para los búferes de protocolo no lo haría trivial; No soy consciente de algo para hacer esto, pero una opción sería serializarlo en un búfer con su propio encabezado de longitud y con datos adicionales según sea necesario.

Necesita agregar un prefijo de longitud porque no se agrega de manera predeterminada, y de lo contrario estaría leyendo basura al final de su búfer. Incluso los 0 finales no serían legales (sería buscar un número de campo).

No puedo comentar sobre el C++ o C# versión de Jon, pero para mi C# versión (protobuf-net), que debería ser capaz de hacer algo así (no probado):

using(var ms = new MemoryStream(fixedLength)) { 
    ms.SetLength(fixedLength); 
    Serializer.SerializeWithLengthPrefix(ms, obj); 
    if(ms.Length > fixedLength) { /* boom */ } 
    byte[] arr = ms.ToArray(); // use this 
} 

Este debería deserializarse bien si también se usa DeserializeWithLengthPrefix.


Re las preguntas (comentarios); SerializeWithLengthPrefix es un protobuf-net -método específico; allí puede ser algo en la versión de C++, pero es bastante simple. La forma más fácil de implementar esta desde cero es:

  • asumen vamos a dejar una longitud fija (4 bytes) de cabecera para indicar la cantidad de datos real que tenemos
  • saltar 4 bytes (o escribir 00- 00-00-00)
  • ahora serializar con el resto de la memoria intermedia
  • encontrar la cantidad de bytes que acaba de escribir
  • escriben que el valor de vuelta al comienzo del buffer

a la inversa, es obvio:

  • Leer 4 bytes y la interpretan como un int
  • deserializar tanto, ya que los datos

Es un poco poco más complejo en protobuf- net, ya que ofrece algunas opciones más (cómo debe codificarse el int, y si debe envolver esto para que todo se pueda tratar como un flujo protobuf de 100% de valor - en particular I sospechoso Acabo de describir el comportamiento si le pedí SerializeWithLengthPrefix para utilizar la codificación de ancho fijo y "campo 0").

+0

Muchas gracias Marc, siempre servicial. ¿Puede explicar con más detalle qué hace SerializeWithLengthPrefix en realidad? ¡Gracias de nuevo! – Roey

+0

Una cosa más, estoy deserializando con la versión C++ de Protocol Buffers ... ¿existe DeserializeWithLengthPrefix de alguna forma en la versión C++? – Roey

+0

@Roey - Editaré esa información en ... –

Cuestiones relacionadas