我在将 Protobuf 数据存储到磁盘时遇到问题。我拥有的应用程序使用协议缓冲区通过套接字传输数据(工作正常),但是当我尝试将数据存储到磁盘时它失败了。实际上,保存数据报告没有问题,但我似乎无法再次正确加载它们。任何提示将不胜感激。
void writeToDisk(DataList & dList)
{
// open streams
int fd = open("serializedMessage.pb", O_WRONLY | O_CREAT);
google::protobuf::io::ZeroCopyOutputStream* fileOutput = new google::protobuf::io::FileOutputStream(fd);
google::protobuf::io::CodedOutputStream* codedOutput = new google::protobuf::io::CodedOutputStream(fileOutput);
// save data
codedOutput->WriteLittleEndian32(PROTOBUF_MESSAGE_ID_NUMBER); // store with message id
codedOutput->WriteLittleEndian32(dList.ByteSize()); // the size of the data i will serialize
dList.SerializeToCodedStream(codedOutput); // serialize the data
// close streams
delete codedOutput;
delete fileOutput;
close(fd);
}
我已经验证了这个函数中的数据,dList 包含我期望的数据。流报告没有发生错误,并且有合理数量的字节被写入磁盘。(文件大小也很合理)但是当我尝试读回数据时,它不起作用。此外,真正奇怪的是,如果我将更多数据附加到此文件,我可以读取第一条消息(但不是最后的消息)。
void readDataFromFile()
{
// open streams
int fd = open("serializedMessage.pb", O_RDONLY);
google::protobuf::io::ZeroCopyInputStream* fileinput = new google::protobuf::io::FileInputStream(fd);
google::protobuf::io::CodedInputStream* codedinput = new google::protobuf::io::CodedInputStream(fileinput);
// read back
uint32_t sizeToRead = 0, magicNumber = 0;
string parsedStr = "";
codedinput->ReadLittleEndian32(&magicNumber); // the message id-number i expect
codedinput->ReadLittleEndian32(&sizeToRead); // the reported data size, also what i expect
codedinput->ReadString(&parsedstr, sizeToRead)) // the size() of 'parsedstr' is much less than it should (sizeToRead)
DataList dl = DataList();
if (dl.ParseFromString(parsedstr)) // fails
{
// work with data if all okay
}
// close streams
delete codedinput;
delete fileinput;
close(fd);
}
显然我在这里省略了一些代码以简化一切。作为旁注,我还尝试将消息序列化为字符串并通过 CodedOutputStream 保存该字符串。这也不起作用。我已经验证了该字符串的内容,所以我猜罪魁祸首一定是流函数。
这是一个 Windows 环境,带有协议缓冲区和 Qt 的 c++。
感谢您的时间!