马歇尔多个protobuf提交

时间:2010-08-18 14:16:53

标签: c++ protocol-buffers

背景

我正在使用Google的protobuf,我想使用C ++读取/写入几千兆字节的protobuf编组数据到文件中。由于建议将每个protobuf对象的大小保持在1MB以下,我认为写入文件的二进制流(如下图所示)可行。每个偏移量包含到达下一个偏移量的字节数,直到达到文件末尾。通过这种方式,每个protobuf都可以保持在1MB以下,我可以将它们全部融合到我的内心。

[int32 offset]
[protobuf blob 1]
[int32 offset]
[protobuf blob 2]
...
[eof]

我有一个适用于Github的实现:

src/glob.hpp
src/glob.cpp
test/readglob.cpp
test/writeglob.cpp

但是我觉得我写了一些不好的代码,并且会对如何改进代码表示赞赏。因此,

问题:

  • 我正在使用reinterpret_cast<char*>从二进制fstream读取/写入32位整数。由于我使用的是protobuf,我假设所有的机器都是小端的。我还声称int确实是4个字节。 考虑到这两个限制性假设,是否有更好的方法将32位整数读/写为二进制fstream
  • 在从fstream读取时,我创建了一个临时的固定长度char缓冲区,这样我就可以将这个固定长度的缓冲区传递给protobuf库,使用ParseFromArray进行解码,因为ParseFromIstream将使用整个流。我真的更喜欢告诉库最多读取N的下一个fstream字节,但是protobuf中似乎没有这个功能。 fstream的最多N个字节传递函数最常用的方法是什么?或者我的设计是否完全颠倒以至于我应该完全考虑采用不同的方法?

修改

  • @ codymanix:我正在向char投标,因为如果我没有弄错的话,istream::read需要一个char数组。我也没有使用提取运算符>>,因为我读它是用于二进制流的糟糕形式。或者这最后一条建议是假的吗?
  • @ Martin York:已移除new / delete,转而使用std::vector<char>glob.cpp现已更新。谢谢!

1 个答案:

答案 0 :(得分:2)

不要使用新的[] /删除[]。

相反,我们在发生异常时保证std :: vector作为解除分配。

不要假设读数会返回您请求的所有字节 检查gcount()以确保您得到了所要求的内容。

而不是让Glob根据构造函数中的开关实现输入和输出的代码。而是实现两个专门的类,如ifstream / ofstream。这将简化界面和使用。