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