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