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").
Muchas gracias Marc, siempre servicial. ¿Puede explicar con más detalle qué hace SerializeWithLengthPrefix en realidad? ¡Gracias de nuevo! – Roey
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
@Roey - Editaré esa información en ... –