使用Google protobuf,我将序列化的消息数据保存到文件中 - 在每个文件中都有几条消息。我们有C ++和Python版本的代码,所以我需要使用两种语言都可用的protobuf函数。我已尝试使用SerializeToArray和SerializeAsString,似乎存在以下不幸条件:
SerializeToArray:正如一个答案中所建议的那样,使用它的最佳方法是为每条消息添加前缀数据大小。这对C ++来说非常有用,但在Python中看起来不太可能 - 我错了吗?
SerializeAsString:这会生成一个等效于它的二进制对应的序列化字符串 - 我可以保存到文件中,但是如果序列化结果中的一个字符是\ n,那么会发生什么? - 我们如何找到行结尾,或者那个消息的结尾?
请允许我稍微改写一下。据我所知,我无法用C ++编写二进制数据,因为我们的Python应用程序无法读取数据,因为它只能解析字符串序列化的消息。那么我应该在C ++和Python中使用SerializeAsString
吗?如果是,那么最好将这些数据存储在文本文件而不是二进制文件中吗?我的直觉是二元的,但你可以看到这看起来不像是一种选择。
答案 0 :(得分:5)
以这种方式连接消息的最佳做法是在每个消息的前面加上大小。这样你读取大小(尝试32位int或其他东西),然后将该字节数读入缓冲区并反序列化它。然后阅读下一个尺寸等等。
写作也一样,你先写出信息的大小,然后写出信息本身。
有关详细信息,请参阅protobuf文档中的Streaming Multiple Messages。
答案 1 :(得分:4)
我们已经成功地对base64编码消息,并使用简单的\ n来分隔消息。这将取决于您的使用 - 我们需要将消息存储在“日志”文件中。它自然会有开销编码/解码 - 但这对我们来说甚至都不是一个问题。
将这些消息保留为行分隔文本的优点迄今为止对于维护和调试非常有用。弄清楚文件中有多少条消息? wc -l
。找到第N条消息 - head ... | tail
。找出您需要通过2个VPN和Citrix解决方案访问的远程系统上的记录有什么问题?复制粘贴邮件并将其邮寄给程序员。
答案 2 :(得分:0)
Protobuf是一种二进制格式,因此读写应该是二进制的,而不是文本。 如果你不想要二进制格式,你应该考虑使用protobuf以外的东西(有很多文本数据格式,比如XML,JSON,CSV);仅使用文本抽象是不够的。