C ++ Google Protocol Buffers:序列化为char *?

时间:2012-02-06 10:16:03

标签: c++ protocol-buffers

我想将协议缓冲区序列化为char *。这可能吗?我知道可以按照以下方式序列化文件:

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风格的char *,以便通过网络进行传输。

怎么做?请记住,我对C ++很新。

5 个答案:

答案 0 :(得分:38)

这很简单:

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

另外检查documentation of MessageLite class它的父类Message,它包含有用的方法。

答案 1 :(得分:10)

您可以将输出搜索到ostringstream并使用stream.str()获取字符串,然后使用string.c_str()访问c字符串。

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

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

不要忘记为sstream添加std::ostringstream

答案 2 :(得分:4)

您可以使用ByteSize来获取消息占用的字节数,然后SerializeToArray使用编码消息填充数组。

答案 3 :(得分:1)

还有一行代码可以处理序列化数据可以包含零的事实。

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

答案 4 :(得分:1)

具有用于数组的智能指针的解决方案:

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