Ram*_*mya 3 c++ null serialization stdstring protocol-buffers
我正在使用 Google Protocol Buffer 进行消息序列化。这是我的示例原型文件内容。
package MessageParam;
message Sample
{
message WordRec
{
optional uint64 id = 1;
optional string word = 2;
optional double value = 3;
}
message WordSequence
{
repeated WordRec WordSeq = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试用 C++ 序列化消息,如下所示
MessageParam::Sample::WordSequence wordseq;
for(int i =0;i<10;i++)
{
AddRecords(wordseq.add_wordseq());
}
std::string str = wordseq.SerializeAsString();
Run Code Online (Sandbox Code Playgroud)
执行上述语句后,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);
}
Run Code Online (Sandbox Code Playgroud)
wordseq.DebugString() 的值为 WordSeq { id: 4 word: "software" value: 1 } WordSeq { id: 19 word: "technical" value: 0.70992374420166016 } WordSeq { id: 51 word: "hardware" value: 0.626017153263092 } 如何将“wordseq”序列化为包含嵌入 NULL 字符的字符串?
您不应该尝试将 Protobuf 存储在wstring. wstring用于存储 unicode 文本,但 protobuf 不是 unicode 文本或任何其他类型的文本,它是原始字节。您应该以字节形式保存。如果您确实需要在文本上下文中存储 Protobuf,您应该首先对其进行 Base64 编码。
可以说,Protobufs 使用std::string存储字节(而不是文本)是令人困惑的。也许它应该std::vector<unsigned char>一直使用。std::string你应该像你一样对待 protobufs std::vector<unsigned char>。
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |