C++ 如何使用 Google Protocol Buffers 序列化为 char*?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9158576/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 12:24:07  来源:igfitidea点击:

How to serialize to char* using Google Protocol Buffers?

c++protocol-buffers

提问by Eamorr

I want to serialize my protocol buffer to a char*. Is this possible? I know one can serialize to file as per:

我想将我的协议缓冲区序列化为 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;
}

But I'd like to serialize to a C-style char* for transmission across a network.

但我想序列化为 C 风格的 char* 以通过网络传输。

How to do this? Please bear in mind that I'm very new to C++.

这该怎么做?请记住,我对 C++ 很陌生。

回答by Evgen Bodunov

That's easy:

这很容易:

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

Check documentation of MessageLite classalso, it's parent class of Message and it contains useful methods.

检查MessageLite 类的文档,它是 Message 的父类,它包含有用的方法。

回答by Fox32

You can serailze the output to a ostringstreamand use stream.str()to get the string and then access the c-string with string.c_str().

您可以将输出序列化为 aostringstream并用于stream.str()获取字符串,然后使用string.c_str().

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

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

Don't forget to include sstreamfor std::ostringstream.

不要忘记包含sstreamfor std::ostringstream

回答by David Schwartz

You can use ByteSizeLong()to get the number of bytes the message will occupy and then SerializeToArray()to populate an array with the encoded message.

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

回答by Hemaolle

Solution with a smart pointer for the array:

使用数组智能指针的解决方案:

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

回答by GhislainS

Still one more line of code to take care of the fact that the serialized data can contain zero's.

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

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