Ich möchte meinen Protokollpuffer auf ein Zeichen * serialisieren. Ist das möglich? Ich weiß, man kann serialisieren, um wie folgt zu archivieren:
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;
}
Ich möchte jedoch eine Serialisierung auf ein Zeichen * im C-Stil für die Übertragung über ein Netzwerk durchführen.
Wie macht man das? Bitte denken Sie daran, dass ich C++ noch nicht kenne.
Das ist einfach:
size_t size = address_book.ByteSizeLong();
void *buffer = malloc(size);
address_book.SerializeToArray(buffer, size);
Überprüfen Sie die Dokumentation der MessageLite-Klasse auch die übergeordnete Klasse von Message und enthält nützliche Methoden.
Sie können die Ausgabe in eine ostringstream
sortieren und mit stream.str()
die Zeichenfolge abrufen und dann mit string.c_str()
auf die c-Zeichenfolge zugreifen.
std::ostringstream stream;
address_book.SerializeToOstream(&stream);
string text = stream.str();
char* ctext = text.c_str();
Vergessen Sie nicht, sstream
für std::ostringstream
anzugeben.
Sie können ByteSize
verwenden, um die Anzahl der Bytes zu ermitteln, die die Nachricht belegen soll, und dann SerializeToArray
, um ein Array mit der codierten Nachricht zu füllen.
Noch eine weitere Codezeile, um darauf zu achten, dass die serialisierten Daten Nullen enthalten können.
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
Lösung mit einem intelligenten Zeiger für das Array:
size_t size = address_book.ByteSizeLong();
std::unique_ptr<char[]> serialized(new char[size]);
address_book.SerializeToArray(&serialized[0], static_cast<int>(size));