protocol protobuffers protobuf google buffers array c++ protocol-buffers

c++ - protobuffers - protocol buffer list



C++ Google Protocol Buffers: ¿serializar a char*? (5)

Eso es fácil:

size_t size = address_book.ByteSizeLong(); void *buffer = malloc(size); address_book.SerializeToArray(buffer, size);

Verifique también la documentación de la clase MessageLite , es la clase principal del mensaje y contiene métodos útiles.

Quiero serializar mi búfer de protocolo a un char *. es posible? Sé que uno puede serializar para archivar según:

fstream output("/home/eamorr/test.bin", ios::out | ios::trunc | ios::binary); if (!address_book.SerializeToOstream(&output)) { cerr << "Failed to write address book." << endl; return -1; }

Pero me gustaría serializar un char * de estilo C para su transmisión a través de una red.

¿Como hacer esto? Por favor, tenga en cuenta que soy muy nuevo en C ++.


Puede seralizar la salida a una ostringstream y usar stream.str() para obtener la cadena y luego acceder a la cadena-c con string.c_str() .

std::ostringstream stream; address_book.SerializeToOstream(&stream); string text = stream.str(); char* ctext = text.c_str();

No olvide incluir sstream para std::ostringstream .


Puede usar ByteSize para obtener el número de bytes que ocupará el mensaje y luego SerializeToArray para rellenar una matriz con el mensaje codificado.


Solución con un puntero inteligente para la matriz:

size_t size = address_book.ByteSizeLong(); std::unique_ptr<char[]> serialized(new char[size]); address_book.SerializeToArray(&serialized[0], static_cast<int>(size));


Todavía una línea más de código para cuidar el hecho de que los datos serializados pueden contener cero.

std::ostringstream stream; address_book.SerializeToOstream(&stream); string text = stream.str(); char* ctext = text.c_str(); // ptr to serialized data buffer // strlen(ctext) would wrongly stop at the 1st 0 it encounters. int data_len = text.size(); // length of serialized data