Google Protocol Buffer序列化字符串可以包含嵌入的NULL字符吗?
Google Protocol Buffer serialized string can contain embedded NULL characters in it?
我正在使用 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() 的值为
词序{
编号:4
单词:"software"
值:1
}
词序 {
编号:19
单词:"technical"
值:0.70992374420166016
}
词序 {
编号:51
单词:"hardware"
值:0.626017153263092
}
如何将 "wordseq" 序列化为包含嵌入 NULL 字符的字符串?
您不应尝试将 Protobuf 存储在 wstring
中。 wstring
用于存储 unicode 文本,但是 protobuf 不是 unicode 文本也不是任何其他类型的文本,它是原始字节。你应该保持字节形式。如果你真的需要在文本上下文中存储 Protobuf,你应该先对其进行 base64 编码。
可以说 Protobufs 使用 std::string
来存储字节(而不是文本)是令人困惑的。也许它应该一直使用 std::vector<unsigned char>
。您应该像对待 std::vector<unsigned char>
.
一样对待 protobufs 的 std::string
我正在使用 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() 的值为 词序{ 编号:4 单词:"software" 值:1 } 词序 { 编号:19 单词:"technical" 值:0.70992374420166016 } 词序 { 编号:51 单词:"hardware" 值:0.626017153263092 } 如何将 "wordseq" 序列化为包含嵌入 NULL 字符的字符串?
您不应尝试将 Protobuf 存储在 wstring
中。 wstring
用于存储 unicode 文本,但是 protobuf 不是 unicode 文本也不是任何其他类型的文本,它是原始字节。你应该保持字节形式。如果你真的需要在文本上下文中存储 Protobuf,你应该先对其进行 base64 编码。
可以说 Protobufs 使用 std::string
来存储字节(而不是文本)是令人困惑的。也许它应该一直使用 std::vector<unsigned char>
。您应该像对待 std::vector<unsigned char>
.
std::string