Google Protocol Buffer 序列化字符串可以包含嵌入的 NULL 字符吗?

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 字符的字符串?

Ken*_*rda 5

您不应该尝试将 Protobuf 存储在wstring. wstring用于存储 unicode 文本,但 protobuf 不是 unicode 文本或任何其他类型的文本,它是原始字节。您应该以字节形式保存。如果您确实需要在文本上下文中存储 Protobuf,您应该首先对其进行 Base64 编码。

可以说,Protobufs 使用std::string存储字节(而不是文本)是令人困惑的。也许它应该std::vector<unsigned char>一直使用。std::string你应该像你一样对待 protobufs std::vector<unsigned char>