我正在使用Google协议缓冲区进行邮件序列化。 这是我的示例原型文件内容。
package MessageParam;
message Sample
{
message WordRec
{
optional uint64 id = 1;
optional string word = 2;
optional double value = 3;
}
message WordSequence
{
repeated WordRec WordSeq = 1;
}
}
我正在尝试在C ++中序列化消息,如下面的
MessageParam::Sample::WordSequence wordseq;
for(int i =0;i<10;i++)
{
AddRecords(wordseq.add_wordseq());
}
std::string str = wordseq.SerializeAsString();
执行上述语句后,str的大小为430.它中嵌入了空字符。当我尝试将此str分配给std :: wstring时,std :: wstring在找到第一个空字符时终止。
void AddRecords(MessageParam::Sample::WordRec* wordrec)
{
int id;
cin>>id;
wordrec->set_id(id);
getline(cin, *wordrec->mutable_word());
long value;
cin>>value;
wordrec->set_value(value);
}
wordseq.DebugString()的值是 WordSeq { id:4 字:&#34;软件&#34; 价值:1 } WordSeq { id:19 字:&#34;技术&#34; 值:0.70992374420166016 } WordSeq { id:51 字:&#34;硬件&#34; 值:0.626017153263092 } 如何序列化&#34; wordseq&#34;作为包含嵌入的NULL字符的字符串?
答案 0 :(得分:2)
您不应该尝试将Protobuf存储在INFO
中。 wstring
用于存储unicode文本,但是protobuf不是unicode文本,也不是任何其他类型的文本,它是原始字节。你应该保持字节形式。如果你真的需要在文本上下文中存储Protobuf,你应该首先对其进行64位编码。
可以说Protobufs&#39;使用wstring
来存储字节(而不是文本)令人困惑。也许它应该一直使用std::string
。你应该对待protobufs&#39; std::vector<unsigned char>
就像你std::string
一样。