web-dev-qa-db-fra.com

Tampons de protocole C++ Google: sérialiser en char *?

Je veux sérialiser mon tampon de protocole sur un char *. Est-ce possible? Je sais que l'on peut sérialiser pour classer selon:

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;
}

Mais j'aimerais passer en série à un caractère de style C * pour la transmission sur un réseau.

Comment faire ça? N'oubliez pas que je suis très nouveau en C++.

19
Eamorr

C'est facile:

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

Vérifiez la documentation de la classe MessageLite aussi, c'est la classe parente de Message et elle contient des méthodes utiles.

38
Evgen Bodunov

Vous pouvez effectuer une sérialisation de la sortie sur ostringstream et utiliser stream.str() pour obtenir la chaîne, puis accéder à la chaîne de caractères avec string.c_str().

std::ostringstream stream;
address_book.SerializeToOstream(&stream);

string text = stream.str();
char* ctext = text.c_str();

N'oubliez pas d'inclure sstream pour std::ostringstream.

10
Fox32

Vous pouvez utiliser ByteSize pour obtenir le nombre d'octets que le message va occuper, puis SerializeToArray pour renseigner un tableau avec le message codé.

3
David Schwartz

Encore une ligne de code supplémentaire pour tenir compte du fait que les données sérialisées peuvent contenir des zéros.

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
0
GhislainS

Solution avec un pointeur intelligent pour le tableau:

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