我似乎无法在 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_ptrforpayloadBuf就像我为prefixBuf.
感谢您的输入!