2

使用 Google protobuf,我将我的序列化消息数据保存到一个文件中 - 每个文件中都有几条消息。我们有 C++ 和 Python 版本的代码,所以我需要使用两种语言都可用的 protobuf 函数。我已经尝试过使用 SerializeToArray 和 SerializeAsString 并且似乎有以下不幸的情况:

  1. SerializeToArray:正如在一个答案中所建议的,使用它的最佳方法是在每条消息前面加上它的数据大小。这对 C++ 很有用,但在 Python 中,这看起来不太可能——我错了吗?

  2. SerializeAsString:这会生成一个与其二进制对应的序列化字符串 - 我可以将其保存到文件中,但是如果序列化结果中的字符之一是 \n 会发生什么 - 我们如何找到行尾或消息的结尾那事?

更新:

请允许我稍微改写一下。据我了解,我无法用 C++ 编写二进制数据,因为我们的 Python 应用程序无法读取数据,因为它只能解析字符串序列化消息。然后我应该SerializeAsString同时在 C++ 和 Python 中使用吗?如果是,那么将此类数据存储在文本文件而不是二进制文件中是最佳做法吗?我的直觉是二元的,但正如你所见,这看起来不像是一个选择。

4

3 回答 3

5

以这种方式连接消息的最佳做法是在每条消息前面加上其大小。这样您就可以读取大小(尝试 32 位 int 或其他内容),然后将该字节数读入缓冲区并反序列化它。然后读取下一个尺寸等。

写作也是如此,你首先写出消息的大小,然后是消息本身。

有关更多信息,请参阅protobuf 文档中的Streaming Multiple Messages

于 2009-12-07T10:56:46.017 回答
5

我们在对消息进行 base64 编码以及使用简单的 \n 分隔消息方面取得了巨大成功。这将在很大程度上取决于您的使用 - 我们需要将消息存储在“日志”文件中。它自然有开销编码/解码 - 但这对我们来说甚至都不是问题。

到目前为止,将这些消息保留为行分隔文本的优势对于维护和调试非常宝贵。弄清楚一个文件中有多少条消息?wc -l. 找到第 N 条消息 - head ... | tail。找出您需要通过 2 个 VPN 和 citrix 解决方案访问的远程系统上的记录有什么问题?复制粘贴消息并将其邮寄给程序员。

于 2010-04-20T18:15:56.157 回答
0

Protobuf 是二进制格式,所以读写应该是二进制,而不是文本。如果你不想要二进制格式,你应该考虑使用protobuf以外的东西(有很多文本数据格式,比如XML、JSON、CSV);仅使用文本抽象是不够的。

于 2011-12-20T06:03:01.850 回答