我似乎无法在 protobuf中找到MessageLiteMergeFrom*
类的方法和ParseFrom*
方法之间的明显区别。
我试图最小化我必须做的数据复制量,所以我在下面编写了以下代码来解码长度前缀消息:
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
forpayloadBuf
就像我为prefixBuf
.
感谢您的输入!