从序列化数据中查找协议缓冲区消息类型

时间:2013-03-06 11:23:58

标签: c++ serialization protocol-buffers

我有一些二进制数据,这是通过序列化谷歌协议缓冲类获得的。 如何在运行时找到序列化数据的类。

例如,假设我有一个类abc 。我将这个类abc序列化为二进制数据。 有没有办法验证这个二进制数据是通过序列化类abc,而不是其他类来获得的?

此外,如果我通过 class xyz 的解析方法解析类abc的二进制数据,我怎么知道解析是否成功。

1 个答案:

答案 0 :(得分:3)

protobuf不包括线路上的任何类型信息(除非您自己在protobuf外部执行此操作)。因此,不能严格验证 - 实际上这是事物,因为这意味着类型可以互换和兼容。只要class abc 与其他类型具有兼容的合同,它就会起作用。这里的“兼容”是指:对于两者共有的任何字段数,它们都具有兼容的线型。如果abc将字段4声明为字符串,而另一个类将字段4声明为双精度数字,则在反序列化时它将失败。

您可以使用的另一个“信号”是省略required字段:如果abc始终包含字段3,但您获得的数据省略字段3,则它可能不是abc。请注意,protobuf被设计为版本容忍,但是:您不能假设额外的字段意味着它不是abc,因为它可能是因为数据稍后使用合同的版本,或正在使用扩展字段。同样,缺少可选字段可能会丢失,因为要么他们只是选择不提供值,该字段未在版本上声明他们正在使用的合同。

重新测试成功的解析:这将是特定于实现的。我想想象 c ++实现将有一个要检查的返回值,或者要检查的标志字段。我自己不使用那个api,所以我不能说。在其他一些平台上,如果存在严重问题,我会期望抛出异常(java,.net等)。