我似乎無法找到protobuf中的MessageLite類的MergeFrom*
和ParseFrom*
方法之間的明顯區別。MergeFrom *與ParseFrom *在谷歌的protobuf庫
我試圖儘量減少我必須做數據複製的量,所以我寫了下面的下面的代碼來解碼一個長度爲前綴的消息:
bool StreamMessageDelimiter::receiveWithLengthPrefix(Message& message)
{
google::protobuf::uint32 messageSize;
auto_ptr<google::protobuf::uint8> prefixBuf(new google::protobuf::uint8[sizeof(messageSize)]);
int receivedBytes = receiveNBytes(prefixBuf.get(), sizeof(messageSize));
if(receivedBytes != sizeof(messageSize))
{
return false;
}
CodedInputStream prefixInput(prefixBuf.get(), sizeof(messageSize));
prefixInput.ReadLittleEndian32(&messageSize);
google::protobuf::uint8* payloadBuf = new google::protobuf::uint8[messageSize];
receivedBytes = receiveNBytes(payloadBuf, messageSize);
if(receivedBytes != messageSize)
{
return false;
}
ArrayInputStream rawInput(payloadBuf, messageSize);
CodedInputStream codedInput(&rawInput);
if(!message.MergeFromCodedStream(&codedInput))
{
return false;
}
return true;
}
我的問題是不使用MergeFromCodedStream導致message
取得payloadBuf
的所有權,或message
是否製作底層數據的副本?如果message
確實複製了一份,那麼我明顯應該使用auto_ptr
作爲payloadBuf
,就像我爲prefixBuf
所做的一樣。
感謝您的意見!