Protobuf message——解析二进制文件和文本文件的区别

Protobuf message - parsing difference between binary and text files

在协议缓冲区应用程序的实现过程中,我尝试使用文本 pbtxt 文件来简化我的编程。一旦我对 API 有了更清晰的理解,我的想法就是之后切换到 pb 二进制格式。 (我在 C++ 中工作)

我通过使用 TextFormat::Parse 导入文件使我的应用程序正常运行。 (文件内容来自TextFormat::Print)。然后我生成了相应的二进制文件,我试图用 myMessageVariable.ParsefromCodedStream 导入(文件未压缩)。但我注意到只有一小部分消息是导入的。 myMessageVariable.IsInitialized returns true, thus I guessed that the library "thinks" that it has completely imported the file.

所以我的问题是:导入文件的方式是否有什么不同可以使导入 "half-fail"? (除了明显的原因,一个是二进制的,另一个是文本的?)我们能做些什么来反对它?

读取文本数据和读取二进制数据有一些不同:

  • 文本文件有时会使用自动换行转换(\r\n\n),尤其是在 Windows 平台上。这必须通过以二进制模式打开文件来禁用。
  • 二进制文件在任何时候都可以包含空字节。某些文本处理函数在第一个空字节处停止读取。

如果您能更多地确定有多少消息被解析,这可能会有所帮助。然后你可以看看问题点附近有什么样的字节,例如使用十六进制编辑器。