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

时间:2015-05-21 05:37:32

标签: c++ serialization null protocol-buffers stdstring

我正在使用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字符的字符串?

1 个答案:

答案 0 :(得分:2)

您不应该尝试将Protobuf存储在INFO中。 wstring用于存储unicode文本,但是protobuf不是unicode文本,也不是任何其他类型的文本,它是原始字节。你应该保持字节形式。如果你真的需要在文本上下文中存储Protobuf,你应该首先对其进行64位编码。

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