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++.
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.
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
.
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é.
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
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));