Как сериализовать в char * с использованием буферов протокола Google? - PullRequest
20 голосов
/ 06 февраля 2012

Я хочу сериализовать свой буфер протокола в символ *. Это возможно? Я знаю, что можно сериализовать в файл согласно:

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

Но я бы хотел сериализоваться в символ C-стиля * для передачи по сети.

Как это сделать? Пожалуйста, имейте в виду, что я очень плохо знаком с C ++.

Ответы [ 5 ]

38 голосов
/ 06 февраля 2012

Это просто:

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

Проверьте документацию по классу MessageLite также, это родительский класс Message и он содержит полезные методы.

10 голосов
/ 06 февраля 2012

Вы можете преобразовать вывод в ostringstream и использовать stream.str(), чтобы получить строку, а затем получить доступ к c-строке с помощью string.c_str().

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

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

Не забудьте включить sstream для std::ostringstream.

4 голосов
/ 06 февраля 2012

Вы можете использовать ByteSize для получения количества байтов, которое займет сообщение, а затем SerializeToArray для заполнения массива закодированным сообщением.

1 голос
/ 31 июля 2018

Решение с умным указателем на массив:

size_t size = address_book.ByteSizeLong();
std::unique_ptr<char[]> serialized(new char[size]);
address_book.SerializeToArray(&serialized[0], static_cast<int>(size));
1 голос
/ 16 мая 2017

Еще одна строка кода, чтобы учесть тот факт, что сериализованные данные могут содержать нули.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...