wake-up-neo.com

C++ - Google-Protokollpuffer: Serialisierung nach char *?

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.

19
Eamorr

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.

38
Evgen Bodunov

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.

10
Fox32

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.

3
David Schwartz

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

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));
0
Hemaolle