Eam*_*orr 21 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;
}
Run Code Online (Sandbox Code Playgroud)
但我想序列化为C风格的char*,以便通过网络传输.
这该怎么做?请记住,我对C++很新.
Evg*_*nov 39
这很简单:
size_t size = address_book.ByteSizeLong();
void *buffer = malloc(size);
address_book.SerializeToArray(buffer, size);
Run Code Online (Sandbox Code Playgroud)
另外,检查MessageLite类的文档,它是Message的父类,它包含有用的方法.
Fox*_*x32 10
您可以将输出serailze为a ostringstream并使用stream.str()获取字符串,然后使用.来访问c-string string.c_str().
std::ostringstream stream;
address_book.SerializeToOstream(&stream);
string text = stream.str();
char* ctext = text.c_str();
Run Code Online (Sandbox Code Playgroud)
不要忘记,包括sstream为std::ostringstream.
使用数组的智能指针的解决方案:
size_t size = address_book.ByteSizeLong();
std::unique_ptr<char[]> serialized(new char[size]);
address_book.SerializeToArray(&serialized[0], static_cast<int>(size));
Run Code Online (Sandbox Code Playgroud)