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 平台上。这必须通过以二进制模式打开文件来禁用。
- 二进制文件在任何时候都可以包含空字节。某些文本处理函数在第一个空字节处停止读取。
如果您能更多地确定有多少消息被解析,这可能会有所帮助。然后你可以看看问题点附近有什么样的字节,例如使用十六进制编辑器。
在协议缓冲区应用程序的实现过程中,我尝试使用文本 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 平台上。这必须通过以二进制模式打开文件来禁用。 - 二进制文件在任何时候都可以包含空字节。某些文本处理函数在第一个空字节处停止读取。
如果您能更多地确定有多少消息被解析,这可能会有所帮助。然后你可以看看问题点附近有什么样的字节,例如使用十六进制编辑器。