我想将协议缓冲区序列化为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 ++很新。
答案 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));